Scrapy框架与Spynner集合相结合需要js
优采云 发布时间: 2020-08-08 07:53网页采集有几种类型:
1. 静态网页
2. 动态网页(需要js,ajax来动态加载数据的网页)
3. 只有模拟登录后才能采集的网页
4. 加密的网页
3,4的解决方案和想法将在后续博客中阐明
当前,仅针对1、2的解决方案和想法:
1. 静态网页
有很多方法可以采集和分析静态网页! java和python都提供了很多工具包或框架,例如java httpclient,Htmlunit,Jsoup,HtmlParser等,Python urllib,urllib2,BeautifulSoup,Scrapy等,但没有详细介绍,在线材料很多.
两个. 动态网页
对于采集,动态网页是需要由js和ajax动态加载以获取数据的那些网页. 有两种数据采集方案:
1. 通过数据包捕获工具分析js和ajax的请求,并模拟请求以在加载js后获取数据.
2. 调用浏览器的内核以获取加载的网页源代码,然后解析源代码
研究爬行动物的人必须了解js. 在线学习材料很多,没有声明,而本文仅出于文章的完整性而写
还有一些用于调用浏览器内核Java的工具包,但它们并不是当今的重点. 今天的重点是文章的标题. Scrapy框架与Spynner结合使用,以采集需要由js和ajax动态加载的网页并提取网页信息(以微信官方帐户列表为例)
在使用Scrapy和Spynner之前,我需要安装环境. 我学习了很长时间的python,并在Mac上抛了很长时间之后,当我快要发疯时成功了,还杀死了很多脑细胞.
获胜是如此悲惨!只需总结一篇文章,当您使用它时,就安装它!
开始...
1. 创建微信公众号文章列表采集项目(以下简称微采集)
scrapy startproject weixin
2. 在爬虫目录中创建采集爬虫文件
vim weixinlist.py
编写以下代码
from weixin.items import WeixinItem
import sys
sys.path.insert(0,'..')
import scrapy
import time
from scrapy import Spider
class MySpider(Spider):
name = 'weixinlist'
allowed_domains = []
start_urls = [
'外链网址已屏蔽',
]
download_delay = 1
print('start init....')
def parse(self, response):
sel=scrapy.Selector(response)
print('hello,world!')
print(response)
print(sel)
list=sel.xpath('//div[@class="txt-box"]/h4')
items=[]
for single in list:
data=WeixinItem()
title=single.xpath('a/text()').extract()
link=single.xpath('a/@href').extract()
data['title']=title
data['link']=link
if len(title)>0:
print(title[0].encode('utf-8'))
print(link)
3. 将WeixinItem类添加到items.py
import scrapy
class WeixinItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title=scrapy.Field()
link=scrapy.Field()
4. 在items.py的同一目录中创建一个下载中间件downloadwebkit.py,并将以下代码写入其中:
import spynner
import pyquery
import time
import BeautifulSoup
import sys
from scrapy.http import HtmlResponse
class WebkitDownloaderTest( object ):
def process_request( self, request, spider ):
# if spider.name in settings.WEBKIT_DOWNLOADER:
# if( type(request) is not FormRequest ):
browser = spynner.Browser()
browser.create_webview()
browser.set_html_parser(pyquery.PyQuery)
browser.load(request.url, 20)
try:
browser.wait_load(10)
except:
pass
string = browser.html
string=string.encode('utf-8')
renderedBody = str(string)
return HtmlResponse( request.url, body=renderedBody )
此代码是在加载网页后调用浏览器内核以获取源代码