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访问的太频繁了,被识别出来是爬虫,然后被屏蔽了....

  • 相关阅读:
    Fiddler抓包使用教程-会话图标
    Fiddler抓包使用教程-安装配置
    Fiddler抓包使用教程-扫盲篇
    Java web 开发填坑记 2 -如何正确的创建一个Java Web 项目
    Java Web 开发填坑记- 如何正确的下载 Eclipse
    Android 监听 WiFi 开关状态
    Android 获取系统语言(兼容7.0)
    Android 监听手机GPS打开状态
    Android Monkey的使用
    Android 开源库和项目 3
  • 原文地址:https://www.cnblogs.com/dplearning/p/4903238.html
Copyright © 2011-2022 走看看