爬虫拉勾网的时候F12找不到csspositionnAJax

首先通过pip 安装scrapy ,安装方式一百度一大堆~
这里就不再赘述
安装成功之后,开始今天的教程
执行:scrapy startproject First 生成项目文件
如图所示即为创建项目成功
创建成功后会生成如图所示的目录结构
我的理解是:
用户自己写的爬虫py文件应放在spiders目录下,
Item用来保存爬取到的数据,
middlewares 是Spider中间件
pipelines 是管道
scrapy.cfg是项目的配置文件
其实不懂也不重要,用到的时候自己去理解
接下来开始写爬虫
爬虫需要放到spiders文件夹下
给这个爬虫文件起名为second.py
创建成功,进行模块的导入
import scrapy1
写一个类,继承scrapy的Spider
给这只爬虫起个名字叫做 sean
我们的爬取目标选择了拉勾网,所以将拉勾网的网址放入start_urls中
class Lagou(scrapy.Spider):
name = "sean"
start_urls = [
"https://www.lagou.com/"
爬取到信息后需要进行解析,使用parse方法进行解析
def parse(self , response):1
然后我们需要分析拉勾网的结构,才可以取出其中的数据
这里我使用的是chrome浏览器
F12进入开发者工具
点击左上角箭头所指的工具
再点击左侧
快速的找到这个元素
并且可以看到html的标签结构如下,
我们接下来需要通过selector(选择器)来进行内容的选择
通过xpath选择器,找到class=”menu_box”的div
获得它下一个div标签,的下一个dl标签,的下一个a标签,通过遍历取出所有符合条件的内容
使用以下语句作为选择器来选择到a标签
for item in response.xpath(‘//div[@class=”menu_box”]/div/dl/dd/a’):
for item in response.xpath(
jobClass = item.xpath('text()').extract()
jobUrl = item.xpath("@href").extract_first()
oneItem = FirstItem()
oneItem["jobClass"] = jobClass
oneItem["jobUrl"] = jobUrl
12345678910
只要获取到标签的 内容text(),和 链接@href 就得到了 工作类型和该工作类型的链接
jobClass = item.xpath('text()').extract()
jobUrl = item.xpath("@href").extract_first()12
在处理得到的数据的时候,需要进入items.py文件
import scrapy
class FirstItem(scrapy.Item):
jobClass = scrapy.Field()
jobUrl = scrapy.Field()123456
定义jobClass 和 jobUrl 来接收获取到的这两条数据
回到second.py
在文件头部导入FirstItem
from First.items import FirstItem1
然后在parse方法中实例化一个FirstItem,并且将获取到的值放入其中
oneItem = FirstItem()
oneItem["jobClass"] = jobClass
oneItem["jobUrl"] = jobUrl
yield oneItem1234
然后使用yield输出oneItem
接下来执行这个爬虫
scrapy的爬虫执行方式和平时执行py文件有所不同
**scrapy crawl sean**1
sean是我们在上面定义的爬虫的name
回车执行,如图所示效果,输出了工作类型,和对应的url
我们还可以使用
**scrapy crawl sean -o shujv.json**1
将获取到的数据存储在shujv.json中
回车执行之后,发现当前目录下多了一个shujv.json文件,双击打开,查看内容
存储是存储进去了,英文显示的还是英文,但是中文居然显示成了乱码,
事实上这并不是乱码,编码过后的数据。
我们需要对数据进行解析
通过阅读源码知道,在scrapy.exporters 的 JsonLinesItemExporter类中,对数据进行了编码。
所以我们可以在spiders文件夹的同级目录下创建一个xxx文件夹,在xxx文件夹中创建一个__init__.py文件,在里面写一个类继承JsonLinesItemExporter,并且设置不编码。
__init__.py文件内容如下
from scrapy.exporters import JsonLinesItemExporter
class chongxie(JsonLinesItemExporter):
def __init__(self , file , **kwargs):
super(chongxie , self).__init__(file , ensure_ascii = None)
重写完了之后需要在settings.py文件中进行设置,添加如下语句
FEED_EXPORTERS_BASE = {
'json' : 'First.xxx.chongxie' ,
'jsonlines' : 'scrapy.contrib.exporter.JsonLinesItemExporter',
再次运行爬虫,结果如下
编码问题解决了
整体代码如下
import scrapy
from First.items import FirstItem
class Lagou(scrapy.Spider):
name = "sean"
start_urls = [
"https://www.lagou.com/"
def parse(self , response):
for item in response.xpath('//div[@class="menu_box"]/div/dl/dd/a'):
jobClass = item.xpath('text()').extract()
jobUrl = item.xpath("@href").extract_first()
oneItem = FirstItem()
oneItem["jobClass"] = jobClass
oneItem["jobUrl"] = jobUrl
yield oneItem12345678910111213141516171819
xxx/__init__.py
from scrapy.exporters import JsonLinesItemExporter
class chongxie(JsonLinesItemExporter):
def __init__(self , file , **kwargs):
super(chongxie , self).__init__(file , ensure_ascii = None)
import scrapy
class FirstItem(scrapy.Item):
jobClass = scrapy.Field()
jobUrl = scrapy.Field()1234
夜深了,先写这么多,明天接着写 : )
啦啦啦,再度深夜码字 QAQ
在昨天,我们初步获取到了jobClass 和 jobUrl 为我们下一步深入的爬取获取到了重要的信息,jobUrl
在平时我们用浏览器打开拉勾网的时候,通过点击箭头所指的地方,可以进入下级目录
实质上是点击了一个a标签,访问到了它的href属性的url
我们取出的jobUrl就是这个地址,通过这个地址访问下一个界面
是java的界面,准备获取以下箭头所指的信息
首先我们需要通过以下代码访问到jobUrl,
yield scrapy.Request(url = jobUrl , callback=self.parse_url)1
callback是回调函数,我们需要在下面实现这个方法,但是有一点我们需要提前完成,那就是攻克拉勾的反爬虫机制,我们通过设置cookie来完成这个功能,接下来先教大家获取到cookie。
在java这个界面F12 , 进入调试模式 , 选择Network,F5 ,找到左侧的java/,点击,在右侧选择Headers,找到其中的Request Headers 中的 Cookie,复制下来,粘贴到编译器中
但是在scrapy中,粘贴过来的cookie是不可以直接使用的,需要将它做成一个dict才可以使用,
cookie = {
'user_trace_token':'08-fb-11e7-8e7c-4',
'LGUID':'08-9624dbfd-87fb-11e7-8e7c-4 ',
'index_location_city':'%E5%85%A8%E5%9B%BD',
'JSESSIONID':'ABAAABAAAIAACBIB27A20589F52DDD944E69CC53E778FA9',
'TG-TRACK-CODE':'index_code',
'X_HTTP_TOKEN':'5c26ebb801b1efa53d578f',
'SEARCH_ID':'739dffd93b144c0c53b6c1',
'_gat':'1',
'Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6':',,,',
'Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6':'',
'_gid':'GA1.2.',
'_ga':'GA1.2.',
'LGSID':'54-d2b13687-cdcd-11e7-996a-4',
'PRE_UTM':'' ,
'PRE_HOST':'www.baidu.com',
'PRE_SITE':'https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D7awz0WxWjKxQwJ9xplXysE6LwOiAde1dreMKkGLhWzS%26wd%3D%26eqid%3D806a75ed',
'PRE_LAND':'https%3A%2F%2Fwww.lagou.com%2F',
'LGRID':'54-d2b13811-cdcd-11e7-996a-4'
}1234567891011121314151617181920
这是我格式化之后的cookie ,你们可以和原始的cookie进行一下对比
有了cookie之后我们的request需要修改一下,来使用我们获取到的cookie
yield scrapy.Request(url = jobUrl2
,cookies=self.cookie , callback=self.parse_url)1
我们在下面定义一个函数叫做parse_url完成回调
整体代码如下:
import scrapy
from First.items import FirstItem
class Lagou(scrapy.Spider):
name = "sean"
start_urls = [
"https://www.lagou.com/"
cookie = {
'user_trace_token':'08-fb-11e7-8e7c-4',
'LGUID':'08-9624dbfd-87fb-11e7-8e7c-4 ',
'index_location_city':'%E5%85%A8%E5%9B%BD',
'JSESSIONID':'ABAAABAAAIAACBIB27A20589F52DDD944E69CC53E778FA9',
'TG-TRACK-CODE':'index_code',
'X_HTTP_TOKEN':'5c26ebb801b1efa53d578f',
'SEARCH_ID':'739dffd93b144c0c53b6c1',
'_gat':'1',
'Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6':',,,',
'Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6':'',
'_gid':'GA1.2.',
'_ga':'GA1.2.',
'LGSID':'54-d2b13687-cdcd-11e7-996a-4',
'PRE_UTM':'' ,
'PRE_HOST':'www.baidu.com',
'PRE_SITE':'https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D7awz0WxWjKxQwJ9xplXysE6LwOiAde1dreMKkGLhWzS%26wd%3D%26eqid%3D806a75ed',
'PRE_LAND':'https%3A%2F%2Fwww.lagou.com%2F',
'LGRID':'54-d2b13811-cdcd-11e7-996a-4'
# user_trace_token=08-9624d434-87fb-11e7-8e7c-5254005c3644; LGUID=08-9624dbfd-87fb-11e7-8e7c-5254005c3644; index_location_city=%E5%85%A8%E5%9B%BD; JSESSIONID=ABAAABAACDBAAIA84B4A11C7DD6D; PRE_UTM=m_cf_cpt_baidu_ PRE_HOST=bzclk.baidu. PRE_SITE=http%3A%2F%2Fbzclk.baidu.com%2Fadrc.php%3Ft%3D06KL00c00f7Ghk60yUKm0FNkUs0Bwkwp00000PW4pNb000005ulRUZ.THL0oUhY1x60UWdBmy-bIy9EUyNxTAT0T1dBuA7-njcvnW0snjDzn1DY0ZRqf16zPjnkrHbvfWPDrj6zP1ckPYRvPDc1f1IAwj-Anjc0mHdL5iuVmv-b5Hnsn1nznjR1njfhTZFEuA-b5HDv0ARqpZwYTZnlQzqLILT8UA7MULR8mvqVQ1qdIAdxTvqdThP-5ydxmvuxmLKYgvF9pywdgLKW0APzm1Y1PjbkPs%26tpl%3Dtpl__11224%26l%3D%26attach%3Dlocation%253D%2526linkName%253D%2525E6%2525A0%252587%2525E9%2525A2%252598%2526linkText%253D%2525E3%252580%252590%2525E6%25258B%252589%2525E5%25258B%2525BE%2525E7%2525BD%252591%2525E3%252580%252591%2525E5%2525AE%252598%2525E7%2525BD%252591-%2525E4%2525B8%252593%2525E6%2525B3%2525A8%2525E4%2525BA%252592%2525E8%252581%252594%2525E7%2525BD%252591%2525E8%252581%25258C%2525E4%2525B8%25259A%2525E6%25259C%2525BA%2526xp%253Did%28%c247d9c%252522%29%25252FDIV%25255B1%25255D%25252FDIV%25255B1%25255D%25252FDIV%25255B1%25255D%25252FDIV%25255B1%25255D%25252FH2%25255B1%25255D%25252FA%25255B1%25255D%2526linkType%253D%2526checksum%253D220%26wd%3D%25E6%258B%2589%25E5%258B%25BE%25E7%25BD%2591%26issp%3D1%26f%3D8%26ie%3Dutf-8%26rqlang%3Dcn%26tn%3Dbaiduhome_pg%26inputT%3D2975%26sug%3D%2525E6%25258B%252589%2525E5%25258B%2525BE%2525E7%2525BD%252591; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2F%3Futm_source%3Dm_cf_cpt_baidu_pc; TG-TRACK-CODE=index_ SEARCH_ID=bafdb699e0; _gid=GA1.2..; _ga=GA1.2..; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=,,,; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=; LGSID=56-3f41ebb3-ced1-11e7-9983-5254005c3644; LGRID=01-8432ac74-ced2-11e7-9983-5254005c3644
def parse(self , response):
for item in response.xpath('//div[@class="menu_box"]/div/dl/dd/a'):
jobClass = item.xpath('text()').extract()
jobUrl = item.xpath("@href").extract_first()
oneItem = FirstItem()
oneItem["jobClass"] = jobClass
oneItem["jobUrl"] = jobUrl
yield scrapy.Request(url = jobUrl
,cookies=self.cookie , callback=self.parse_url)
def parse_url(self , response):
print("parse_url 方法")123456789101112131415161718192021222324252627282930313233343536373839404142434445
再次运行爬虫,发现服务器返回的状态码为302(重定向)
将我们重定向到了拉钩的登录界面,在这个界面我们是无法爬取到数据的,所以我们应该想办法解决这个问题,这也是拉勾的另一个反爬虫机制。
因为我们没有使用浏览器代理来进行请求,拉勾网可以通过这个方式来对我们的爬虫进行重定向,使我们无法获取到数据
我们需要获取到User-Agent
还在刚才获取cookie的页面,在一个角落里我们发现了这个User-Agent
那么我们怎么去使用它呢?
先在settings.py文件中进行如下设置
MY_USER_AGENT = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36",
"Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/ Ubuntu/10.10 (maverick) Firefox/3.6.10",
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddleware.useragent.UserAgentMiddleware': None,
'First.middlewares.MyUserAgentMiddleware': 400,
}1234567891011
这里User-Agent可以设置多个,我这里进行举例,使用两个,随后我们会随机取出一个进行使用
下面是对DOWNLOADER_MIDDLEWARES(下载中间件)进行设置,
然后进入middlewares.py文件,进行User-Agent的选择
首先导入我们需要的模块
import scrapy
from scrapy import signals
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
import random
在下面定义类,继承UserAgentMiddleware,对User-Agent进行设置
class MyUserAgentMiddleware(UserAgentMiddleware):
def __init__(self, user_agent):
self.user_agent = user_agent
@classmethod
def from_crawler(cls, crawler):
return cls(
user_agent=crawler.settings.get('MY_USER_AGENT')
def process_request(self, request, spider):
agent = random.choice(self.user_agent)
request.headers['User-Agent'] = agent1234567891011121314
再次启动爬虫,服务器返回状态码200,请求成功,成功回调
接下来我们又需要分析网站的结构,来获取到自己需要的数据
还是使用之前的方法,
还是使用xpath选择器选择出所需要的数据,
for sel2 in response.xpath('//ul[@class="item_con_list"]/li'):
jobName = sel2.xpath('div/div/div/a/h3/text()').extract()
jobMoney = sel2.xpath('div/div/div/div/span/text()').extract()
jobNeed = sel2.xpath('div/div/div/div/text()').extract()
jobCompany = sel2.xpath('div/div/div/a/text()').extract()
jobType = sel2.xpath('div/div/div/text()').extract()
jobSpesk = sel2.xpath('div[@class="list_item_bot"]/div/text()').extract()
这个大家可以自己进行尝试,不只这一种选择方法,我之后也会对我的选择方法进行优化,现在只求得到数据
在items.py文件中进行声明
jobName = scrapy.Field()
jobMoney = scrapy.Field()
jobNeed = scrapy.Field()
jobCompany = scrapy.Field()
jobType = scrapy.Field()
jobSpesk = scrapy.Field()123456
再在second.py中进行存储,并且yield Item
Item = FirstItem()
Item["jobName"] = jobName
Item["jobMoney"] = jobMoney
Item["jobNeed"] = jobNeed
Item["jobCompany"] = jobCompany
Item["jobType"] = jobType
Item["jobSpesk"] = jobSpesk
yield Item12345678
在终端命令下输入scrapy crawl sean -o shujv2.json 执行爬虫,并将爬取到的数据放入shujv2.json文件中
结束之后打开shujv2.json文件
前半部分看起来正常,但是后半部分却多了很多换行符,我们需要对换行符进行处理,我们暂且选择strip的方法进行选取,之后再进行优化。
修改代码如下:
jobName = sel2.xpath('div/div/div/a/h3/text()').extract()
jobMoney = sel2.xpath('div/div/div/div/span/text()').extract()
jobNeed = sel2.xpath('div/div/div/div/text()').extract()
jobNeed = jobNeed[2].strip()
jobCompany = sel2.xpath('div/div/div/a/text()').extract()
jobCompany =jobCompany[3].strip()
jobType = sel2.xpath('div/div/div/text()').extract()
jobType = jobType[7].strip()
jobSpesk = sel2.xpath('div[@class="list_item_bot"]/div/text()').extract()
jobSpesk =jobSpesk[-1].strip()123456789101112
清空shujv2.json ,再次运行爬虫
问题得以解决。
项目基本完成,但是还有一个问题,我们这只是爬取到了没一种工作的第一页的数据,我们还需要换页。如图所示有30页,我们只爬取到了第一页
通过测试换页,我们可以发现页数的规律
那就很简单了,我们只需要在jobUrl后面拼接1-30数字就可以了
修改代码如下:
for i in range(30):
jobUrl2 = jobUrl + str(i+1)
yield scrapy.Request(url = jobUrl2
,cookies=self.cookie , meta = {"jobClass":jobClass} , callback=self.parse_url)
pass12345678
用jobUrl2接收拼接后的url,请求这个url,一共循环30次。
为了防止有的工作不是30页,我们将请求语句用try。。。except。。。包括,防止出现BUG,
再次运行爬虫,疯狂的爬取数据。我运行了20min,大概爬取到了8W条数据。
我是python爬虫新手,我的爬虫有很多不足的地方~希望大家不吝指教
我也是CSDN博客的新手,写文章也有很多不足,欢迎大家指正~共同学习
&link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea.css"&
此代码运行建议Python3,省却中文编码的麻烦
遇到的几个问题:
(1)拉钩网的数据是通过js的ajax动态生成,所以不能直接爬取,而是通过post’http://www.lagou.com/j...
拉勾网是现在互联网招聘比较火热的一个网站,本篇文章主要是爬取拉勾网“数据分析师”这个岗位,并且对所爬取到的信息,进行数据分析。数据采集拉勾网的岗位信息主要是用json文件存储,在position这个j...
现在很多网站都是动态异步加载的,就是说,网页打开了,先给你看上面一部分东西,然后剩下的东西再慢慢加载。
所以你可以看到很多网页,都是慢慢的刷出来的,或者有些网站随着你的移动,很多信息才慢慢加载出...
拉勾网数据爬取
北京数据挖掘方向的岗位数据
https://www.lagou.com/jobs/list_数据挖掘?px=new&city=上海#order...
最近想做一份关于拉勾网数据分析类职业的报告,便顺手写了个简单的爬虫,记录分享如下。
二、思路整理
1、首先我们打开拉勾网,并搜索“”数据分析“”,显示出来的职位便是我们的目标
2、接下来我们...
很多网站都用了一种叫做Ajax(异步加载)的技术,通常我们会发现这种网页,打开了,先给你看上面一部分东西,然后剩下的东西再慢慢加载,也就是局部加载。所以你可以看到很多网页,浏览器中的网址没变,但是数据...
本文实现自动爬取拉钩网招聘信息,并将信息保存在本地文本中
源代码:https://github.com/nnngu/LagouSpider
1、首先我们打开拉勾网,并搜索“java”,显示出来的职位信息就是我们的目标。
这几天学习了 python 爬虫的入门知识,也遇到很多坑,开个贴记录一下
原文出自:自我的青春
笔者说明~~~!!!只用于学习交流,私自用于其他途径,后果自负!!!
1、相关jar准备
fastjson-1.1.41.jar ,...
没有更多推荐了,拉勾网反爬虫做的比较严,请求头多添加几个参数才能不被网站识别
找到真正的请求网址,返回的是一个json串,解析这个json串即可,而且注意是post传值
通过改变data中pn的值来控制翻页
job_name读取的结果是一个列表& & &['JAVA高级工程师、爬虫工程师']& &,而我只想得到里面的字符串,在用job_name[0]的时候,爬取过程中会报下标错误,不知道怎么回事,都看了一遍没问题啊,只能不处理这个列表了
1 import requests
2 from lxml import etree
3 import time
4 import re
6 headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36',
'Cookie': '_ga=GA1.2.; user_trace_token=15-e-11e8-ac93- LGUID=15--955e-11e8-ac93- WEBTJ-ID=C2dea595ec0a-0ca5deb5d1dcb9-172f-1652dea595f51f; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=,; LGSID=18-ae23-11e8-bae9- PRE_UTM=m_cf_cpt_baidu_ PRE_HOST=www.baidu. PRE_SITE=https%3A%2F%2Fwww.baidu.com%2Fs%3Fie%3Dutf-8%26f%3D8%26rsv_bp%3D0%26rsv_idx%3D1%26tn%3Dbaidu%26wd%3Dlagou%2520wang%2520%26rsv_pq%3D8f8c8d4500066afd%26rsv_t%3Deaa21Vp5dXD8YMkjoybb0H4UW4n0ReZfxSBiBne14tXfDsN5XKFydx2jVnA%26rqlang%3Dcn%26rsv_enter%3D1%26rsv_sug3%3D12%26rsv_sug1%3D2%26rsv_sug7%3D101%26rsv_sug2%3D0%26inputT%3D1970%26rsv_sug4%3D3064; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2Flp%2Fhtml%2Fcommon.html%3Futm_source%3Dm_cf_cpt_baidu_ _gid=GA1.2.; X_HTTP_TOKEN=0d3af14e092a; LG_LOGIN_USER_ID=5f3d6b41f24b2423bae0aa2ecabcb36ef97074ff9fdec683ae51; _putrc=3AF3C123F89F2B170EADC; JSESSIONID=ABAAABAAAIAACBI302EB6DF4BD54C909C1D; login= unick=%E5%88%98%E4%BA%9A%E6%96%8C; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; hasDeliver=0; gate_login_token=caaeb807c1e317ec0fac806; index_location_city=%E5%85%A8%E5%9B%BD; TG-TRACK-CODE=search_ _gat=1; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=; LGRID=35-ec87e3ce-9e25-11e8-a37b-4; SEARCH_ID=aaf43d4b9f7',
'Referer': 'https://www.lagou.com/jobs/list_%E7%88%AC%E8%99%AB?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=sug&suginput=pachong',
'Origin': 'https://www.lagou.com'
13 data = {
'first': 'false',
'kd': '爬虫'
19 def get_list_page(page_num):
url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
data['pn'] = page_num
response = requests.post(url, headers=headers, data=data)
result = response.json()
positions = result['content']['positionResult']['result']
for position in positions:
positionId = position['positionId']
position_url = 'https://www.lagou.com/jobs/%s.html' %positionId
parse_detail_page(position_url)
33 def parse_detail_page(url):
job_information = {}
response = requests.get(url, headers=headers)
# response.raise_for_status()
html = response.text
html_element = etree.HTML(html)
job_name = html_element.xpath('//div[@class="job-name"]/@title')
job_description = html_element.xpath('//dd[@class="job_bt"]//p//text()')
for index, i in enumerate(job_description):
job_description[index] = re.sub('\xa0', '', i)
job_address = html_element.xpath('//div[@class="work_addr"]/a/text()')
job_salary = html_element.xpath('//span[@class="salary"]/text()')
# 字符串处理去掉不必要的信息
for index, i in enumerate(job_address):
job_address[index] = re.sub('查看地图', '', i)
while '' in job_address:
job_address.remove('')
# job_address_detail = html_element.xpath('//div[@class="work_addr"]/a[-2]/text()')
# print(job_address_detail)
job_information['job_name'] = job_name
job_information['job_description'] = job_description
job_information['job_address'] = job_address
job_information['job_salary'] = job_salary
print(job_information)
61 def main():
for i in range(1, 31):
get_list_page(i)
print('='*30 + '第%s页'%i + '='*30)
67 if __name__ == '__main__':
阅读(...) 评论()21天打造分布式爬虫(一) - 暮无雪IT教程分享网
&1.1.urlopen函数的用法
#encoding:utf-8
from urllib import request
res = request.urlopen("https://www.cnblogs.com/")
print(res.readlines())
#urlopen的参数
#def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
*, cafile=None, capath=None, cadefault=False, context=None):
&1.2.urlretrieve函数
&将网页上的文件保存到本地
#coding:utf-8
from urllib import request
res = request.urlretrieve("https://www.cnblogs.com/",'cnblog.html')
#urlretrieve参数
#def urlretrieve(url, filename=None, reporthook=None, data=None):
&1.3.参数编码和解码函数
&urlencode函数用于编码中文和特殊字符
#urlencode函数
# 简单用法
#from urllib import parse
# data = {'name':'德瑞克','age':100}
# qs = parse.urlencode(data)
# print(qs)
#name=%E5%BE%B7%E7%91%9E%E5%85%8B&age=100
from urllib import request,parse
url = "http://www.baidu.com/s"
params = {"wd":"博客园"}
qs = parse.urlencode(params)
url = url + "?" + qs
res = request.urlopen(url)
print(res.read())
parse_qs函数用于将经过编码后的url参数进行解码。
from urllib import parse
qs = "name=%E5%BE%B7%E7%91%9E%E5%85%8B&age=100"
print(parse.parse_qs(qs))
#{'name': ['德瑞克'], 'age': ['100']}
&1.4.urlparse和urlsplit函数用法
&urlparse和urlsplit都是用来对url的各个组成部分进行分割的,唯一不同的是urlsplit没有"params"这个属性.
from urllib import request,parse
url = "https://www.baidu.com/s?wd=cnblog#2"
result = parse.urlparse(url)
print(result)
#ParseResult(scheme='https', netloc='www.baidu.com', path='/s', params='', query='wd=cnblog', fragment='2')
print('scheme:',result.scheme)
print('netloc:',result.netloc)
print('path:',result.path)
print('query:',result.query)
#scheme: https
# netloc: www.baidu.com
# path: /s
# query: wd=cnblog
&1.5.Request爬去拉勾网职位信息
Request类的参数
class Request:
def __init__(self, url, data=None, headers={},
origin_req_host=None, unverifiable=False,
method=None):
爬去拉钩网职位信息
拉勾网的职位信息是在Ajax.json里面
#利用Request类爬去拉勾网职位信息
from urllib import request,parse
url = "https://www.lagou.com/jobs/positionAjax.json?city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false"
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0. Safari/537.36",
"Referer":"https://www.lagou.com/jobs/list_python?city=%E5%8C%97%E4%BA%AC&cl=false&fromSearch=true&labelWords=&suginput="
#post请求需要提交的数据
'first':'true',
'kd':'python'
#post请求的data数据必须是编码后的字节类型
req = request.Request(url,headers=headers,data=parse.urlencode(data).encode('utf-8'),method='POST')
#建立一个请求对象
res = request.urlopen(req)
#获取的信息是字节类型,需要解码
print(res.read().decode('utf-8'))
1.6.ProxyHandler代理
代理原理:在请求目的网站之前,先请求代理服务器,然后让代理服务器去请求目的网站,获取到数据后,再返回给我们。
#代理的使用
from urllib import request
url = "https://www.baidu.com/s?wd=cnblog"
#1.使用ProxyHandler传入代理构建一个handler
# handler = request.ProxyHandler({'http':'115.210.31.236.55:9000'})
handler = request.ProxyHandler({'http':'115.210.31.236.55:9000'})
#2.使用创建的handler构建一个opener
opener = request.build_opener(handler)
#3.使用opener去发送一个请求
res = opener.open(url)
print(res.read())
转载自:博客园
全部评论: 0 条
21天打造分布式爬虫-多线程下载表情包(五)
VK2C21 NSOP16 SOP20 SOP24/ 28取代兼容HT16C21是一款存储器映射和多功能 LCD液晶控制驱动芯片
爬虫入门之Scrapy框架基础rule与LinkExtractors(十一)

我要回帖

更多关于 position是什么意思 的文章

 

随机推荐