第六天,拉勾网整站爬取

 
对应github地址:知乎和拉钩
 
 
小技巧
1. cmder:模拟linux终端
2. 添加windows路径到pycharm环境中
import sys
import os
sys.path.insert(0, "E:\python_workshop\Article"),其中的0表示路径查找顺序
另外一种方法
project_dir = os.path.abspath(os.path.dirname(__file__))
IMAGE_STORE = os.path.join(project_dir, 'image')
3.  就像有些网站需要headers信息一样,拉钩网站需要检查cookies头部信息,这个网站不需要登录信息就可以访问
4. 一个爬智联,拉钩,51job的github:https://github.com/wqh0109663/JobSpiders
 
 
 
 
一. 拉钩网数据爬取
scrapy genspider -t crawl lagou https://www.lagou.com
 
 
二. CrawlSpider源码分析
 
1. crawlspider继承spider,所以它的入口也是start_requests函数
2. 源码中已经定义了parse函数,所以在我们的lagou.py中不能再定义parse函数
 
 
3. 核心代码是_parse_response函数
这里的callback就是parse函数中的parse_start_url,cb_kwargs用来接收参数.
 
 
3.1 if callback代码段说明
如果存在callback,首先调用parse_start_url; 然后把返回结果作为参数传给process_results函数
其实如果不在lagou.py中重载parse_start_url和process_results的话,上面的if callback代码段是无效的。
parse_start_url默认定义为空列表,可以在lagou.py中重载此函数,
process_results函数直接返回results,不做任何处理
 
 
3.2 if follow and self._follow_links代码段
1)其中follow_links定义在set_crawler函数中,指明是在settings.py中定义一个字段CRAWLSPIDER_FOLLOW_LINKS为True
 
2)requests_to_follow函数
 
首先判断response类型是否正确,如果正确的话,使用set()把response得到的URL去重
其中rule.process_links和rule.link_extractor都是Rule类中的方法,并且在lagou.py中重载了rule
 
 
Rule类如下
 
 
 
 
三. 补充内容
 
1. enumarate()基本使用方法
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中
 
 
2. 深拷贝和浅拷贝
在Python中对象的赋值其实就是对象的引用。当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。
浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,把对象复制一遍,但是该对象中引用的其他对象我不复制
深拷贝:外围和内部元素都进行了拷贝对象本身,而不是引用。也就是,把对象复制一遍,并且该对象中引用的其他对象我也复制。
 
 
 
四. 编写rules
在lagou.py中编写提取网页类型的rules
其实后面两个没用,
 
五. 编写items.py
scrapy shell -s USER_AGENT="user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36" https://www.lagou.com/jobs/4543973.html
 
1. 定义item和item loader
 
2. lagou.py中定义parse_item
注意:
实例化的时候参数item=LagouJobItem()后面的小括号一定要有
 
 
3. debug模式测试,一直显示302重定向到登陆页面,需要在settings.py中加入
 
 
4. 但是爬取的时候还是会有问题,最好在lagou.py的LagouSpider类中加入
custom_settings = {
    # 设置为False,cookies将不会发送给web server
    "COOKIES_ENABLED": False,
    # 设置下载延迟
    "DOWNLOAD_DELAY": 1,
    # 下面的内容都是XHR中的newMessageList.json的请求头里的信息
    'DEFAULT_REQUEST_HEADERS': {
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.8',
        'Connection': 'keep-alive',
        'Cookie': 'JSESSIONID=ABAAABAAAFCAAEGBC99154D1A744BD8AD12BA0DEE80F320; '
                  'showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; '
                  'hasDeliver=0; _ga=GA1.2.1111395267.1516570248; _gid=GA1.2.1409769975.1516570248; '
                  'user_trace_token=20180122053048-58e2991f-fef2-11e7-b2dc-525400f775ce; PRE_UTM=; '
                  'LGUID=20180122053048-58e29cd9-fef2-11e7-b2dc-525400f775ce; '
                  'index_location_city=%E5%85%A8%E5%9B%BD; X_HTTP_TOKEN=7e9c503b9a29e06e6d130f153c562827;'
                  ' _gat=1; LGSID=20180122055709-0762fae6-fef6-11e7-b2e0-525400f775ce; PRE_HOST=github.com;'
                  ' PRE_SITE=https%3A%2F%2Fgithub.com%2Fconghuaicai%2Fscrapy-spider-templetes; '
                  'PRE_LAND=https%3A%2F%2Fwww.lagou.com%2Fjobs%2F4060662.html;'
                  ' Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1516569758,1516570249,1516570359,1516571830;'
                  ' _putrc=88264D20130653A0; login=true; unick=%E7%94%B0%E5%B2%A9;'
                  ' gate_login_token=3426bce7c3aa91eec701c73101f84e2c7ca7b33483e39ba5;'
                  ' LGRID=20180122060053-8c9fb52e-fef6-11e7-a59f-5254005c3644; '
                  'Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1516572053; '
                  'TG-TRACK-CODE=index_navigation; SEARCH_ID=a39c9c98259643d085e917c740303cc7',
        'Host': 'www.lagou.com',
        'Origin': 'https://www.lagou.com',
        'Referer': 'https://www.lagou.com/',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
                      '(KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
    }
}

 

 
说明:
1)custom_settings是spider类中的变量,可覆盖setting中的设置,包括cookie, pipeline等,从而自定义相关信息
 
 
 
六.  items.py中对各字段进行精细处理
 
1. 公司地址提取出来的有额外的html标签信息,应排除
方法
 
这样处理后返回结果如下,有太多空格和查看地图字符
进一步处理方法
此时在查看debug信息中的job_item->_values中的地址信息
 
 
2. 工作分类标签tag用逗号连接
方法2
tags = ",".join(self["tags"])
 
 
3. 工作地点中的斜线要去掉
方法
 
 
 
 
 
七   保存数据到mysql
 
之前我们做伯乐在线时在pipelins.py中定义了异步存储数据到mysql,在里面执行了sql语句。现在我们执行拉钩网的数据入库的时候怎么办呢,需要改变pipelines.py中sql语句吗?
这种方法虽然可以,但是不灵活,其实我们可以在items.py中针对不同的爬虫项目定义不同的sql函数
 
1. 修改伯乐在线代码
items.py中的class ArticleItem中添加函数如下
 
修改pipelines.py,异步存储mysql中的do_insert函数修改如下
 
 
2. 修改拉钩网
 
其中ON DUPLICATE KEY UPDATE salary=VALUES(salary), job_desc=VALUES(job_desc)用于数据更新
 
 
3. 时间和字符串之间的转换
>>> from datetime import datetime   
# 把时间格式转换为字符串                              
>>> crawl_time = datetime.now().strftime("%Y-%m-%d")              
>>> crawl_time                                                    
'2018-09-19'        
 
# 把字符串转换为时间格式                                              
>>> create_date = datetime.strptime(crawl_time, "%Y-%m-%d").date()
>>> print(create_date)                                            
2018-09-19                    

 

                                    
 
posted @ 2018-09-28 15:27  坚强的小蚂蚁  阅读(646)  评论(0编辑  收藏  举报