pyspider积累

版权声明:本文为博主原创文章,欢迎转载。 https://blog.csdn.net/u011521609/article/details/79508021

构造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()],
        }

猜你喜欢

转载自blog.csdn.net/u011521609/article/details/79508021
今日推荐