在爬取到http://icloudy.cechina.cn/网页的时候,发现点击“加载更多”会出现新的内容,但是网页却没有发生变化,于是打开F12查看Network发现,会每次点击都会多出来一行,如下:
随便点开一个就可以看到我们真正访问的URL地址:
从这里我们就可以清楚的在xhr返回的header里面看到异步请求的url,这里我们直接访问该url(或者在preview里面可以看到返回的数据)可以看到返回的数据就是新闻数据,也就是我们要爬的数据。接下来就是进行url格式分析,一般都会有规律可循。具体代码如下:
from pyspider.libs.base_handler import *
class Handler(BaseHandler):
crawl_config = {
}
@config(fetch_type="js")
@every(minutes=24 * 60)
def on_start(self):
for i in range(1,8):
self.crawl('http://icloudy.cechina.cn/api/LoadArticleHandler.ashx?pageIndex=' + str(i) + '&pageSize=12&siteId=7', callback=self.index_page)
@config(fetch_type="js") #代码中加入这行可以解决动态js封装数据的情况
@config(age=10 * 24 * 60 * 60)
def index_page(self, response):
data = response.text.split(',')
url = []
for i in range(1,len(data)):
if data[i][:5] == '"Url"':
a = 'http://icloudy.cechina.cn' + data[i].split('"')[-2]
url.append(a)
for i in url:
self.crawl(i, callback=self.detail_page)
@config(fetch_type="js")
@config(priority=2)
def detail_page(self, response):
if response.doc('#detail3-2').text() == '':
neirong = response.doc('.article-content > p').text()
else:
neirong = response.doc('#detail3-2').text()
return {
"url": response.url,
"title": response.doc('.conDe > h3').text(),
"content": neirong,
"time": response.doc('.from > span').text().split(' ')[1],
"tab": '工业云',
}
我这里使用的是通过切片提取出所需要的ID并合并成每篇新闻正确的url地址,这种方法比较简单,也比较繁琐,主要是因为我确实不太熟悉正则表达式,不知道该如何进行匹配。有大佬希望可以提出指正意见!