最近在学习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的呢,我又如何能抓到所有的,麻烦大家给个思路,谢谢
Scrapy爬取ul.com相关问题
-
- 帖子: 2148
- 注册时间: 2012-12-16 15:43
- 系统: debian
- astolia
- 论坛版主
- 帖子: 6514
- 注册时间: 2008-09-18 13:11
Re: Scrapy爬取ul.com相关问题
???列出所有的不是把View per page选成all吗?Complete List of UL documents只是个普通的链接,View per page才在onchange里面用js执行了一次提交。而这个提交正是发了一个post啊
-
- 帖子: 2148
- 注册时间: 2012-12-16 15:43
- 系统: debian
-
- 帖子: 2148
- 注册时间: 2012-12-16 15:43
- 系统: debian
Re: Scrapy爬取ul.com相关问题
经点醒,这次使用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()
~
-
- 帖子: 2148
- 注册时间: 2012-12-16 15:43
- 系统: debian
Re: Scrapy爬取ul.com相关问题
我再看了下日志,信息如下,说明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是不是不现实?
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相关问题
你的formdata明显不全啊。除去__VIEWSTATE开头的项还缺很多,View per page的选择项都没有。你在页面打开浏览器的控制台,运行下面js代码,这里列出来的才是全部的
__VIEWSTATE那堆每次浏览都不一样,如果确实需要加入也不该硬编码,先用get请求一次,从页面里解析出来再加入到你的formdata里
代码: 全选
i=new FormData(theForm).entries();do{v=i.next();console.log(v.value[0]+"="+v.value[1])}while(!v.done)
-
- 帖子: 2148
- 注册时间: 2012-12-16 15:43
- 系统: debian
Re: Scrapy爬取ul.com相关问题
补全了除VIEWSTATE那堆以外的formdata, 还是指向了错误网页,astolia 写了: ↑2020-12-17 13:48 你的formdata明显不全啊。除去__VIEWSTATE开头的项还缺很多,View per page的选择项都没有。你在页面打开浏览器的控制台,运行下面js代码,这里列出来的才是全部的__VIEWSTATE那堆每次浏览都不一样,如果确实需要加入也不该硬编码,先用get请求一次,从页面里解析出来再加入到你的formdata里代码: 全选
i=new FormData(theForm).entries();do{v=i.next();console.log(v.value[0]+"="+v.value[1])}while(!v.done)
代码: 全选
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"
}
-
- 帖子: 2148
- 注册时间: 2012-12-16 15:43
- 系统: debian
Re: Scrapy爬取ul.com相关问题
明白了,在get的时候代码中也有viewstate这部分,先爬下来,再处理到formdata中,我之前认为只有post时有这些数据,感谢,再琢磨下
-
- 帖子: 2148
- 注册时间: 2012-12-16 15:43
- 系统: debian
Re: Scrapy爬取ul.com相关问题
仔细分析这个网站的提交数据,它是submit和hidden数据想结合的提交,楼上所说的先get在post方法可行,在scrapy中是不是等价于FormRequest.From_Request方法,可以自动获取hidden数据结合你的formdata提交,这样会方便不少,待验证