构造url
配置:
crawl_config = {
"headers" : headers,
"timeout" : 1000,
"cookies" : Cookie
"proxy" : 192.168.1.1:8888
}
# 示例
crawl_config = {
"headers":{
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36"
}
}
构造url:
#url后面带数字的
def __init__(self):
self.base_url = 'http://xxx...../p'
self.page_num = 1
self.total_num = 5
def on_start(self):
while self.page_num <= self.total_num:
url = self.base_url + str(self.page_num)
print (url)
self.crawl(url, callback=self.index_page)
self.page_num += 1
#翻页的
@config(age=10 * 24 * 60 * 60)
def tab_page(self, response):
for each in response.doc('a[href^="https://www.v2ex.com/go/"]').items():
self.crawl(each.attr.href, callback=self.board_page, validate_cert=False)
@config(priority=2)
def board_page(self, response):
#实现自动翻页功能
for each in response.doc('a[href^="https://www.v2ex.com/t/"]').items():
url = each.attr.href
if url.find('#reply')>0:
url = url[0:url.find('#')]
self.crawl(url, callback=self.detail_page, validate_cert=False)
for each in response.doc('a.page_normal').items():
self.crawl(each.attr.href, callback=self.board_page, validate_cert=False)
以上具体见 pyspider示例代码五:实现自动翻页功能
#传入一个list pyspider受到了上面用页数构造url方法的启示,如果不用模拟浏览器点击,用pyspider确实简单一些
def __init__(self):
self.base_url = 'url1'
#完整的url是 url1+目标1,url1+目标2,依此类推
def on_start(self):
list = ['目标1','目标2','目标n']
for i in list:
url = self.base_url + i
self.crawl(url, callback=self.index_page)
#下面一个是解析目标URL同时到detail_page深入爬取,另外一个是翻页,因此调试时会多出来一个,那个就是翻页的。
def index_page(self, response):
for each in response.doc('规则').items():
self.crawl(each.attr.href, callback=self.detail_page)
for each in response.doc('.next').items():
self.crawl(each.attr.href, callback=self.index_page, validate_cert=False)
#用翻页巧妙突破了一个反爬虫,是这样的,爬取一个页面列表必须从主页点击进去,浏览器直接输入url不行,用phantomjs的js_script可以写一个点击事件,但是不会写啊,后来想,直接用翻页点击不就行了嘛,有几次点击就类似翻页几次,pyspider真的好用!虽然示例代码不多,但是积累一下或者多想想总有办法,还是多支持国货,如果遇到大型网站特别复杂要求又多,那就去配置scrapy
href是短链接的获取方法:
一般都是这样的:href=”http://www.>” 有时候为了筛选可以将www后面的内容也跟上,但偶尔会是这样的:href=”/bj_” href里面没有http,如果你从chrome调试工具上可能这么写:a[href^=”/bj”] 但是没用,如在scrapy里面可能需要用到joinurl,但是pyspider的写法还是这样:a[href^=”http”] 虽然没有http,但是就是能识别出来。可能pyspider已经将urljoin功能封装了。
打开真正的网页内容
#使用phantomjs 实现更多 需要在crawl方法添加 fetch_type="js"
self.crawl(each.attr.href, callback=self.detail_page, fetch_type="js", js_script="""function(){setInterval("$('.more-ext-infos.clk-arrow i').click()", 1000);}""",)
#使用真正的地址,例如某写字楼网站
使用chrome network all 然后一个一个找 是http://***.com/Building/GetbuildingList 看response
解析:
#正则表达式
return {
'字段': re.findall(正则表达式, response.text, re.S)
}
#一页返回多行数据 使用send message方法
def detail_page(self, response):
for i, each in enumerate(response.doc('规则').items()):
self.send_message(self.project_name,{
'字段1': response.doc('规则').eq(i).text(),
'字段2':response.doc('规则').eq(i).text(),
'字段n':response.doc('规则').eq(i).text(),}
,url=response.doc('规则').eq(i).attr.href)
def on_message(self, project, msg):
return msg
# 列表表达式的应用
return {
"字段名": [x.text() for x in response.doc('.规则').items()],
"字段1": [y.text() for y in response.doc('规则').items()],
}