Scrapy爬取ul.com相关问题

上网、浏览、聊天、下载等
回复
jinjiachen
帖子: 2148
注册时间: 2012-12-16 15:43
系统: debian

Scrapy爬取ul.com相关问题

#1

帖子 jinjiachen » 2020-12-13 10:44

最近在学习Scrapy框架,普通的静态网页没有问题,目前遇到一个我认为也是静态网页,但是爬不到内容的问题,来请教下思路。
目标地址是: https://www.shopulstandards.com/Catalog ... niqueKey=1
想爬取其中的标准抬头信息,但是我只能第一页的1-8, 我想要爬取所有的。
然后我发现左上角有个Complete List of UL documents, 这正式我要的,但是我发现,点了之后,浏览器上能看到所有标准了,但是URL没有变,还是https://www.shopulstandards.com/Catalog.aspx?UniqueKey=1, 用开发工具在network选项卡看,也没有看出什么实质内容,也是不post的方法,都是get,那么网站如何识别显示1-8还是complete list的呢,我又如何能抓到所有的,麻烦大家给个思路,谢谢
头像
astolia
论坛版主
帖子: 6514
注册时间: 2008-09-18 13:11

Re: Scrapy爬取ul.com相关问题

#2

帖子 astolia » 2020-12-13 12:23

???列出所有的不是把View per page选成all吗?Complete List of UL documents只是个普通的链接,View per page才在onchange里面用js执行了一次提交。而这个提交正是发了一个post啊
jinjiachen
帖子: 2148
注册时间: 2012-12-16 15:43
系统: debian

Re: Scrapy爬取ul.com相关问题

#3

帖子 jinjiachen » 2020-12-13 13:52

astolia 写了: 2020-12-13 12:23 ???列出所有的不是把View per page选成all吗?Complete List of UL documents只是个普通的链接,View per page才在onchange里面用js执行了一次提交。而这个提交正是发了一个post啊
明白了,我一直以为是GET方法,再试试 :Haha
jinjiachen
帖子: 2148
注册时间: 2012-12-16 15:43
系统: debian

Re: Scrapy爬取ul.com相关问题

#4

帖子 jinjiachen » 2020-12-16 22:19

astolia 写了: 2020-12-13 12:23 ???列出所有的不是把View per page选成all吗?Complete List of UL documents只是个普通的链接,View per page才在onchange里面用js执行了一次提交。而这个提交正是发了一个post啊
经点醒,这次使用post方法写了个,log显示200请求成功,但是抓取的内容为空,编程爱好者,代码质量和规范可能有所欠缺,见谅,代码如下,看看思路是否正确,谢谢

代码: 全选

# -*- coding: utf-8 -*-
import scrapy
from scrapy.loader import ItemLoader
from ul.items import UlItem
from scrapy.http import FormRequest

class SearchStdSpider(scrapy.Spider):
    name = 'search_std'
#    allowed_domains = ['ul.com']
#    start_requests = ['https://www.shopulstandards.com/Catalog.aspx?UniqueKey=1']

    def start_requests(self):
        url = 'https://www.shopulstandards.com/Catalog.aspx?UniqueKey=1'
        formdata={
#                "__EVENTTARGET":"ctl00$ctl00$ContentPlaceHolder1$ContentPlaceHolder1$CatalogList$ctl14$CatalogPager$btnPagerDigit1",
                "__EVENTTARGET":"ctl00$ctl00$ContentPlaceHolder1$ContentPlaceHolder1$CatalogList$ctl01$CatalogPager$btnPagerFirst",
                "__EVENTARGUMENT":"",
                "__LASTFOCUS":"",
                "__VIEWSTATEFIELDCOUNT":"361",
                }

        return [FormRequest(url,formdata=formdata,callback=self.parse)]
    def parse(self, response):
        l = ItemLoader(item=UlItem(), response=response)
        l.add_xpath('std','//div[@class="large-2 small-5 columns"]/input/@value')
#        l.add_xpath('std','//*[@id="ContentPlaceHolder1_ContentPlaceHolder1_CatalogList_EditionNumberButton_0"]')
        return l.load_item()
~                             
jinjiachen
帖子: 2148
注册时间: 2012-12-16 15:43
系统: debian

Re: Scrapy爬取ul.com相关问题

#5

帖子 jinjiachen » 2020-12-16 22:30

我再看了下日志,信息如下,说明redirect失败,指向了error的网页,
Redirecting (302) to <GET https://www.shopulstandards.com/error.a ... talog.aspx> from <POST https://www.shopulstandards.com/Catalog ... niqueKey=1>
我想了下,formdata中我只写了一部分,还有个veiwstate的值没有写,因为这个值非常非常长,不知道是不是这个原因,如果要写,这么长写到python是不是不现实?
头像
astolia
论坛版主
帖子: 6514
注册时间: 2008-09-18 13:11

Re: Scrapy爬取ul.com相关问题

#6

帖子 astolia » 2020-12-17 13:48

你的formdata明显不全啊。除去__VIEWSTATE开头的项还缺很多,View per page的选择项都没有。你在页面打开浏览器的控制台,运行下面js代码,这里列出来的才是全部的

代码: 全选

i=new FormData(theForm).entries();do{v=i.next();console.log(v.value[0]+"="+v.value[1])}while(!v.done)
__VIEWSTATE那堆每次浏览都不一样,如果确实需要加入也不该硬编码,先用get请求一次,从页面里解析出来再加入到你的formdata里
jinjiachen
帖子: 2148
注册时间: 2012-12-16 15:43
系统: debian

Re: Scrapy爬取ul.com相关问题

#7

帖子 jinjiachen » 2020-12-21 21:55

astolia 写了: 2020-12-17 13:48 你的formdata明显不全啊。除去__VIEWSTATE开头的项还缺很多,View per page的选择项都没有。你在页面打开浏览器的控制台,运行下面js代码,这里列出来的才是全部的

代码: 全选

i=new FormData(theForm).entries();do{v=i.next();console.log(v.value[0]+"="+v.value[1])}while(!v.done)
__VIEWSTATE那堆每次浏览都不一样,如果确实需要加入也不该硬编码,先用get请求一次,从页面里解析出来再加入到你的formdata里
补全了除VIEWSTATE那堆以外的formdata, 还是指向了错误网页,

代码: 全选

formdata={
                "__EVENTTARGET":"ctl00$ctl00$ContentPlaceHolder1$ContentPlaceHolder1$CatalogList$ctl01$CatalogPager$btnPagerFirst",
                "__EVENTARGUMENT":"",
                "__LASTFOCUS":"",
                "__VIEWSTATEFIELDCOUNT":"361",
                "__PREVIOUSPAGE":"0fygxjmKqxusp-jDhrKybHwE1B4-8tl6dlpSLxEZhbIcTRLe1IvssDYAX8NKiIvNBsEj7dMPmiompbskRypwjQ2",
                "ctl00$ctl00$ddlLanguage":"en-US",
                "ctl00$ctl00$ddlCurrency":"USD",
                "ctl00$ctl00$ContentPlaceHolder1$ContentPlaceHolder1$CatalogChooser":"All",
                "ctl00$ctl00$ContentPlaceHolder1$ContentPlaceHolder1$SearchField":"",
                "ctl00$ctl00$ContentPlaceHolder1$ContentPlaceHolder1$SearchBy":"Keywords",
                "ctl00$ctl00$ContentPlaceHolder1$ContentPlaceHolder1$ApprovedChooser":"All",
                "ctl00$ctl00$ContentPlaceHolder1$ContentPlaceHolder1$CatalogList$ctl01$CatalogPager$ddlPageSize":"10",
                "ctl00$ctl00$ContentPlaceHolder1$ContentPlaceHolder1$CatalogList$ctl14$CatalogPager$ddlPageSize":"10"
                }
大概没有VIEWSTATE这一部分是不行的,请问如何先get一次再解析,因为这部分是出现在formdata中,如果用get方法请求一次页面,在页面的数据中为会有这些数据咯?
jinjiachen
帖子: 2148
注册时间: 2012-12-16 15:43
系统: debian

Re: Scrapy爬取ul.com相关问题

#8

帖子 jinjiachen » 2020-12-21 22:00

明白了,在get的时候代码中也有viewstate这部分,先爬下来,再处理到formdata中,我之前认为只有post时有这些数据,感谢,再琢磨下
jinjiachen
帖子: 2148
注册时间: 2012-12-16 15:43
系统: debian

Re: Scrapy爬取ul.com相关问题

#9

帖子 jinjiachen » 2020-12-22 9:25

仔细分析这个网站的提交数据,它是submit和hidden数据想结合的提交,楼上所说的先get在post方法可行,在scrapy中是不是等价于FormRequest.From_Request方法,可以自动获取hidden数据结合你的formdata提交,这样会方便不少,待验证
回复