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 )

  此代码是在加载网页后调用浏览器内核以获取源代码

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线