zoukankan      html  css  js  c++  java
  • 【飞谷六期】爬虫项目2

    大概知道一些思路了,试试内推网的爬取。

    首先url的格式是:http://www.neitui.me/?name=neitui&handle=lists&keyword={KEY_WORD}&page={CUR_PAGE}

    url后面问号跟着的是参数,等于号后面有值的是有效的参数,无值的可以省略;&是连接符号,用于连接参数的。

    通过XPath提取页面,我今天才知道,原来在谷歌浏览器中用F12显示源码后,可以按Ctrl+F后,通过XPath表达式来查找目标,这样写完XPath表达式后就可以在页面上直接验证了,也容易判断能否化简表达式。

    首先是获取指定岗位的总页数,通过分析源码知道源码中没有总页数这一条。分析页面

    页面靠上部分会给出总职位数,每页固定28个职位,这样似乎可以通过(总职位数/28)+1 来得到页数。

    但是,试了几个页面之后我发现,当总职位数超过1000时的显示就变成下面的样子了:

    这样就不能通过除法得到页数了。

    再观察页码部分

    可以发现,如果没有下一页时,页面上没有向后的图标。分析源码可以通过

     //div[@class="t_pagelink"]//a[@class="next"]

    (分析后发现可以化简成//a[@class="next"])

    来找到向后的图标。

    这样就需要每抓取一页后分析是否还有下一页,如果有就继续抓取。

    我先照着例子写了一个爬虫的代码,想先把response.body存储下来

    from scrapy.spider import BaseSpider
    
    class NeituiSpider(BaseSpider):
        name = "neitui"
        allowed_domains = ["neitui.me"]
        start_urls = ["http://www.neitui.me/?name=neitui&handle=lists&keyword=Python&page=2"]
        
        def parse(self, response):
            filename = response.url.split("&")[-2].split("=")[-1]
            with open(filename, 'wb') as f:
                f.write(response.body)

    结果,居然悲剧了....

    获取的body根本不是我想要的,而是一段很短的内容。我估计是因为没有设置头部等信息导致出了错。下一步学习怎么自定义头部信息。

    研究了半天,试出来设置headers的方法了

    #encoding:utf-8
    from scrapy.spider import BaseSpider
    from scrapy.http import FormRequest, Request
    
    class NeituiSpider(BaseSpider):
        name = "neitui"
        #allowed_domains = ["neitui.me"]
        start_urls = ["http://www.neitui.me/?name=neitui&handle=lists&keyword=Python&page=2",
                    'http://sou.zhaopin.com/jobs/searchresult.ashx?kw=python&sm=0&p=1']
        
        def __init__(self):
            self.headers = {
                            'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0',
                            'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                            'Accept-Language':'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
                            #'Accept-Encoding':'gzip, deflate',
                            'Connection':'keep-alive'
                            }   
        
        def start_requests(self): #该方法必须返回一个可迭代对象(iterable)。该对象包含了spider用于爬取的第一个Request。
            for url in self.start_urls:
                yield FormRequest(url,
                                    headers = self.headers,
                                    callback = self.parse)#使用回调函数
        
        def parse(self, response):
            filename = response.url.split("&")[-2]
            with open(filename, 'wb') as f:
                f.write(response.body)

    注意:上面的#encoding:utf-8不能省略,否则会出错

    然而,还是有问题

    看状态码:智联招聘的获取成功了,但是内推网的失败了。

    后来问了老师,告诉我是因为这个阿里云的IP访问的太频繁了,被识别出来是爬虫,然后被屏蔽了....

  • 相关阅读:
    关于返回上一页功能
    Mybatis Update statement Date null
    SQLite reset password
    Bootstrap Validator使用特性,动态(Dynamic)添加的input的验证问题
    Eclipse使用Maven2的一次环境清理记录
    Server Tomcat v7.0 Server at localhost failed to start
    PowerShell一例
    Server Tomcat v7.0 Server at libra failed to start
    商标注册英语
    A glance for agile method
  • 原文地址:https://www.cnblogs.com/dplearning/p/4903238.html
Copyright © 2011-2022 走看看