【飞谷六期】爬虫项目2

news/2024/7/19 9:28:33 标签: 爬虫, python, xhtml

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

 

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

转载于:https://www.cnblogs.com/dplearning/p/4903238.html


http://www.niftyadmin.cn/n/1448630.html

相关文章

通向Windows CE(转)

Windows CE的特性指标Microsoft Windows CE是一个紧凑、高效和可扩展的操作系统,适用于各种嵌入系统和产品。它拥有多线程、多任务、确定性的实时、完全抢先式优先级的操作系统环境,专门面向只有有限资源的硬件系统。同时,它的模块化设计方式…

uva 11997 - K Smallest Sums(优先队列)

题目链接:uva 11997 - K Smallest Sums 题目大意:有k个整数数组,包含k个元素,在每个数组中取一个元素加起来可以得到kk个数,输出最小的k个。 解题思路:问题可以转换成对两个长度为k个数组中各选一个后的和中…

mysql中sql中limit_「limit」SQL中limit的用法 - seo实验室

limitlimit子句用于限制查询结果返回的数量,常用于分页查询格式:select * from tableName limit i,n# tableName:表名# i:为查询结果的索引值(默认从0开始),当i0时可省略i# n:为查询结果返回的数量# i与n之…

查看ORACLE数据库信息的一些SQL(转)

查看ORACLE数据库信息的一些SQL,sql,sql教程,Oracle基础1、查看表空间的名称及大小set linesize 140;set pages 200;column tablespace_name format a30;select tablespace_name,min_extents,max_extents,pct_increase,status from dba_tablespaces;select tablespace_name,ini…

HBase(四):HBase API判断表是否存在,结果问题爆棚。。

为什么80%的码农都做不了架构师?>>> 1.首先确认开启了 Hadoop服务--->Zookeeper服务--->HBase服务 hadoopmaster:~$ jps 4066 HMaster 3050 SecondaryNameNode 2865 DataNode 3693 QuorumPeerMain 4224 HRegionServer 2743 NameNode 3278 Resourc…

10种无线技术全接触 (8)(转)

(8) 无线应用中的安全问题无论是无线连接或是无线设备,端到端安全模式都是任何无线应用程序开发需要解决的首要问题。业界新闻报道说目前无线网络安全缺乏的情况很普遍,包括IEEE802.11b WLANs都有未经授权的登陆以及遭受到使一些无线Web网络颇为头疼而臭…

jquery open跳转页面的url_前后端交互与Node:原生Ajax和jquery的ajax

大家好,我来了!本期为大家带来的Web前端学习知识是”前后端交互与Node:原生Ajax和jquery的ajax“,喜欢Web前端的小伙伴,一起看看吧!主要内容ajax是什么ajax作用原生ajax请求jquery的ajax请求jquery里面封装…

系统安全漏洞扫描绝佳助手之Nmap详解(转)

扫描器是帮助你了解自己系统的绝佳助手。象Windows 2K/XP这样复杂的操作系统支持应用软件打开数百个端口与其他客户程序或服务器通信,端口扫描是检测服务器上运行了哪些服务和应用、向Internet或其他网络开放了哪些联系通道的一种办法,不仅速度快&#x…