python-2.7 - 如果两个页面具有相同的链接,如何在抓取过程中移动到下一页?
问题描述
我正在使用scrapy来抓取网站(链接)。我已经使用 for 循环和 yield 函数从这个页面中抓取了所有数据
def parse(self, response):
self.main_cat=response.xpath('//div[@id="products_content"]/div/text()').extract()
self.sub_cat=response.xpath('//div[@class="accordion"]/div[@class="title"]/text()').extract()
Onclick=response.xpath('//div[@class="accordion"]/div[@class="no_title subtitle_chck"]/@onclick').extract()
for index in range(len(Onclick)):
sub_sub_cat=response.xpath('//div[@class="accordion"]/div[@class="no_title subtitle_chck"]/label/text()').extract_first()
removeSearchWord=Onclick[index].replace("submitSearch(","")
numericData=removeSearchWord.replace(");","").split(',')
absolute_url="https://portal.orio.com/webapp/wcs/stores/servlet/SearchDisplayView?storeId=11901&catalogId=10051&langId=-150&pageView=detailed&beginIndex=0&sType=SimpleSearch&categoryId="+numericData[0]+"&showResultsPage=true&navCat="+numericData[1]+"_"+numericData[2]+"&urlLangId=-150&removeFiltersOg=ALL&sortField=name&orderBy=7"
yield Request(absolute_url, callback=self.page)
def page(self,response):
product_page_url=response.xpath('//td[@class="information"]/a/@href').extract()
for url in product_page_url:
yield Request(url, callback=self.product)
在最后一个 yield 函数之后,哪一行代码导致我继续抓取所有其他页面。我知道需要一些 ajax 调用,但我不知道如何为它们实现。你想添加那行代码吗,因为我尝试了很多来找到解决方案,我的最后一个问题也是关于这个问题的答案很好,但我没有得到。
解决方案
实际上下一页网址就在那里。它的<a>
节点包含<img>
带有图像的节点paging_next.png
:
如果您查看该节点,您会看到附加的 onclick javascript 脚本将浏览器 url 更改为下一页 url: 您可以使用 xpath 选择器和一些正则表达式提取它:
url = response.xpath('//a[contains(img/@src,"paging_next")]/@onclick').re("setPage\('(.+?)'")[0]
Out[1]: 'https://portal.orio.com/webapp/wcs/stores/servlet/AjaxCatalogSearchResultView?pageView=detailed&searchTermScope=&orderBy=7&categoryId=146003&beginIndex=25&pageSize=25&maxPrice=&searchType=1002&sortField=name&resultCatEntryType=&searchTerm=&sType=SimpleSearch&filterTerm=&manufacturer=&catalogId=10051&langId=-150&showResultsPage=true&storeId=11901&metaData=YnV5YWJsZToxPE1UQFNQPi1zdXBlcnNlc3Npb246KDEgMyA3KSBBTkQgcHJpY2VfU0VLXzIxOlsqIFRPICpdIEFORCAtcHJpY2VfU0VLXzIxOlsqIFRPIDBdPE1UQFNQPnB1Ymxpc2hlZDox&minPrice='
这是一个丑陋的网址,但它在scrapy中工作得很好:)
一般分页逻辑如下所示:
def parse(self, response):
product_urls = ...
for url in product_urls:
yield Request(url, self.parse_product)
# next page
next_page = ...
if next_page:
yield Request(next_page, self.parse)
else:
self.log('oh no, last page was: {}'.format(response.url), level=logging.INFO)
推荐阅读
- ios - Flutter qr_bar_scanner 在 iOS 设备上的 App Store 错误上传应用程序时出现 UI 问题,它在模拟器中工作正常..?
- mysql - 将查询从 Postresql 转换为 Mysql
- c# - WPF ListViewTemplate InvalidCastException:“无法将“System.Windows.Controls.ListView”类型的对象转换为“System.Windows.DataTemplate”类型。
- python - py3270 - 错误:目标主体名称不正确
- streaming - 是否有免费/便宜的流媒体平台可让您选择要在其上显示流的 URL?
- flask - 如何访问谷歌云虚拟机的本地主机进行烧瓶开发。?
- docker - Nextjs:直接从浏览器输入URL时页面不渲染,404错误
- php - php-fpm 进程在 CurlMultiHandler 中获取 S3 对象时卡住了
- python - Matplotlib:有没有办法从父轴获取颜色条轴?
- sql - xmlSample - 文件不是有效的 xml:文档中根元素之前的标记必须格式正确。SQL XML