无法在scrapy中模拟请求

wqnecbli  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(145)

我试图实现一个请求被发送后,点击继续按钮,从这个website,但响应总是一些xml代码,而不是html。

def start_requests(self):
    codes = range(2022010002,2022010003)
    for code in codes:
        fd = {'EDTPERMITNBR': f'{code}',
         'BTNGUESTLOGIN': '',
         'IW_FormName': 'FrmMain',
         'IW_FormClass': 'TFrmMain',
         'IW_width': '652',
         'IW_height': '797',
         'IW_Action': 'BTNGUESTLOGIN',
         'IW_ActionParam': '',
         'IW_Offset': '',
         'IW_SessionID_': 'S1uxlkMRpiOnzXriVlSIoBbAqJS',
         'IW_TrackID_': '10',
         'IW_WindowID_': 'I1',
         'IW_AjaxID': str(time.time())[:15].replace('.','')}

        url = 'https://cdplusmobile.marioncountyfl.org/pdswebservices/PROD/webpermitnew/webpermits.dll/S1uxlkMRpiOnzXriVlSIoBbAqJS/$/callback?callback=BTNGUESTLOGIN.DoOnAsyncClick&x=138&y=32&which=0&modifiers='
        yield scrapy.FormRequest(url,method='post',formdata=fd,headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/113.0'})

字符串

watbbzwu

watbbzwu1#

请记住,网络抓取是一项复杂的任务,具有潜在的法律的和道德复杂性。您必须遵守您要删除的网站的使用条款,并确保您的行为符合适用的法律法规。
您似乎遇到了这样一种情况,即您接收的是XML而不是HTML。如果服务器将XML作为响应格式发送,或者如果您正在处理 AJAX 端点,则可能会发生这种情况,AJAX端点通常被设计为返回XML、JSON或其他数据格式,而不是完整的HTML页面。
与HTML不同,Scrapy本身并不管理XML响应。对于XML,您需要使用lxml或BeautifulSoup等库来解析它。
下面是在Scrapy spider中实现此功能的方法:

from scrapy.http import TextResponse
from bs4 import BeautifulSoup

def parse(self, response):
    # assuming response.body is a blob of XML
    soup = BeautifulSoup(response.body, 'lxml') # 'lxml' is the parser for xml
    # Now you can find tags, navigate, or extract info from your xml
    # Suppose we want to find the tag 'your_tag' and extract its text
    your_tag = soup.find('your_tag')
    if your_tag:
        your_info = your_tag.text
        print(your_info)

字符串
确保将'your_tag'替换为您感兴趣的实际XML标记。
但是,如果您预期的是HTML而不是XML,那么服务器可能会根据请求头来决定响应格式。您可以尝试添加“Accept”:'text/html'到你的标题,以表明你更喜欢一个HTML响应:

yield scrapy.FormRequest(url, method='post', formdata=fd, headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/113.0',
    'Accept': 'text/html'
})


最后,值得注意的是,表单数据中的“IW_SessionID_”似乎是一个会话ID,每次在服务器上启动会话时,它都可能会更改。如果是这种情况,您需要找到一种方法来动态地获取每个新会话的会话ID。这可能包括首先向页面发送GET请求,从响应中解析会话ID,然后在POST请求中使用该会话ID。
需要强调的是,表单数据中的“IW_SessionID_”似乎是一个会话ID,它可能在服务器上每次启动新会话时都会更改。如果是这样,您需要设计一个方法来动态地获取每个新会话的会话ID。这可能包括首先向页面发出GET请求,从响应中提取会话ID,然后在POST请求中使用该会话ID。
同样值得注意的是,您似乎正在抓取使用Intraweb的网站。Intraweb是一个基于AJAX的Web应用程序开发框架。由于它是动态的,即时生成的请求,因此抓取可能更具挑战性,并且可能需要更高级的抓取方法或能够执行JavaScript的工具,例如Selenium或Pyppeteer。

相关问题