爬取招聘信息代码解析
(刚刚打完了一遍,不知道怎么搞得,粘贴一个文本时,CSDN突然乱码了,动都动不了。啊,又要再来一遍,难受啊)
1、第一部分:导入库
import requests
from lxml import etree
from multiprocessing import Pool#多进程线式爬虫
import time#引入time来测试多进程和单进程处理时间的问题
import datetime
from bs4 import BeautifulSoup
import json
import os
import re
import xlwt#写入excel
#导入各个库,from XXX import XXX,从模块中带入某某函数
1.1、Requests(发出请求以及得到回应)
详细请浏览:https://www.cnblogs.com/mzc1997/p/7813801.html
1.1.1、基本用法:
requests.get()用于请求目标网站,类型是一个HTTPresponse类型
import requests
response = requests.get(‘http://www.baidu.com’)
print(response.status_code) # 打印状态码
print(response.url) # 打印请求url
print(response.headers) # 打印头信息
print(response.cookies) # 打印cookie信息
print(response.text) #以文本形式打印网页源码
print(response.content) #以字节流形式打印
运行结果:
状态码:200
URL:http://www.baidu.com
headers信息:
{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform',
'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html',
'Date': 'Sat, 30 Mar 2019 11:54:11 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:27:57 GMT',
'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315;
max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
1.1.2为get()添加头信息
***作用:***详细请浏览:https://blog.csdn.net/tangxiujiang/article/details/79664710
例如,User-Agent,浏览器的用户代理字符串。告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本。
import requests
heads = {}
headers={'User-Agent' :'Mozilla/5.0 ' \
'(Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 ' \
'(KHTML, like Gecko) Version/5.1 Safari/534.50'}
response = requests.get('http://www.baidu.com',headers=headers)
print(response.headers)
运行结果:
{'Bdpagetype': '1', 'Bdqid': '0xbf52e002000c0f99', 'Cache-Control': 'private', 'Connection': 'Keep-Alive',
'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Cxy_all': 'baidu+112b56c4eedd0de93443b95ffb35e0ae',
'Date': 'Sat, 30 Mar 2019 12:04:53 GMT', 'Expires': 'Sat, 30 Mar 2019 12:04:53 GMT',
'Server': 'BWS/1.1', 'Set-Cookie': 'delPer=0; path=/; domain=.baidu.com, BDSVRTM=12;
path=/, BD_HOME=0; path=/, H_PS_PSSID=1466_21121_28774_28721_28557_28697_28585_28603_28606;
path=/; domain=.baidu.com', 'Strict-Transport-Security': 'max-age=172800',
'Vary': 'Accept-Encoding', 'X-Ua-Compatible': 'IE=Edge,chrome=1',
'Transfer-Encoding': 'chunked'}
1.2、BeautifulSoup
BeautifulSoup是一个灵活的网页解析库,不需要编写正则表达式即可提取有效信息。
详细请浏览:https://www.cnblogs.com/mzc1997/p/7813819.html
1.2.1、标签选择器:
(1)、元素选择:在解析对象声明之后,便可以进行元素选择了,会打印输出选择元素的标签及内容
例如:获取标签名称、获取标签内容、
获取标签内属性:在第一个a标签内有href属性,直接使用[‘name’]或者attrs[‘name’]即可获得属性值,两者是一样的。
(2)、嵌套的选择:一次性获取 html 文档的所有内容
(3)、(额,这个是真的不知道她到底在讲什么,)
- 遍历子节点和子孙节点
- 迭代子节点和子孙节点
- 获取父亲节点和祖先节点
- 获取祖先节点
- 兄弟节点
1.2.2、标准选择器
可根据标签名、属性、内容查找文档
(下面为百度查找的相关知识
相关链接:https://www.cnblogs.com/Jacck/p/7772466.html)
(1)、下面两个函数都是当有了bs对象之后,获取标签组或者单个标签的函数。
find()找到第一个满足条件的标签就返回
findall()找到所有满足条件的标签就返回。
(2)、下面为两个函数的参数表
find (name, attrs, recursive, text, keywords)
findall (name, attrs, recursive, text, limit,keywords)
①参数tag,可以使用参数tag表明需要查找的标签类型,tag可以是多个
.findAll({'h1'}) #返回h1标签列表
.findAll({'h1','h2','h3'}) #返回h1-h3标题标签列表
.findAll({'h1','h2','h3','h4','h5','h6','h7'}) #返回所有标题标签的列表
②参数attribute,使用标签内的若干属性对应的属性值进行标签查找,属性值可以是多个
.findAll('span',{'class':{'green','red'}}) #返回class属性为red和green的span标签列表
③参数recursive,是否使用递归方法遍历每一个子标签,默认是开启,True。
如果设置为False,findAll()只查找文档的一级标签。一般使用中,不用去动这个参数
④参数text,根据标签的文本内容去查找标签列表,通常配合正则表达式使用
nameList = bsObj.findAll(text='the prince')
#匹配所有标签文本内容为‘the prince’的标签列表
nameList = bsObj.findAll(text=re.compile('the*'))
#匹配所有标签文本内容为‘the’开头的标签列表,使用了正则表达式re,正则表达式在此文中不做讲解
⑤参数limit,范围限制参数,显然只能用于findAll()函数。就是限定返回的个数,比如要抽取多少个标签信息做样本之类的
⑥参数keyword,标签内指定属性的标签列表#与attribute参数相似,有一个例外就是用class属性查找标签的时候,直接findAll(class=‘green’)会报错,因为class是保留字
(6)、查找方式
以下只列出了几种基本的,
如果需详细了解还请浏览:https://www.cnblogs.com/mzc1997/p/7813819.html
首先随意假设一个html文本
html = """
<div class="panel">
<div class="panel-heading">
<h3>hello</h3>
</div>
<div class="panel-body">
<ul class="list" id="list-1" name="elements">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>
<ul class="list list-small" id="list-2">
<li class="element">Foo</li>
<li class="element">Bar</li>
</ul>
</div>
</div>
"""
运行BeautifulSoup库
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all('ul'),'\n')#返回一个list 以bs4的bs4.element.tag方式查找
#结果:查找到所有ul标签
print(soup.find_all('ul')[0],'\n') #返回一个list 从0开始索引
#结果:只返回第一个查找到的结果
for ul in soup.find_all('ul'):#使用find-all方法进行嵌套遍历查找
print(ul.find_all('li'))
#结果:第一个标签下的字标li全部被查找到,结果以list{}返回
相关运行结果:
#print(soup.find_all('ul'),'\n')
[<ul class="list" id="list-1" name="elements">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>, <ul class="list list-small" id="list-2">
<li class="element">Foo</li>
<li class="element">Bar</li>
</ul>]
#print(soup.find_all('ul')[0],'\n')
<ul class="list" id="list-1" name="elements">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>
#for ul in soup.find_all('ul'):
print(ul.find_all('li'))
[<li class="element">Foo</li>, <li class="element">Bar</li>, <li class="element">Jay</li>]
[<li class="element">Foo</li>, <li class="element">Bar</li>]
1.3 os和re库
os:返回当前路径
re:主要用于字符串的匹配
由后往前推
(第六周:)
if __name__ == '__main__'
:当.py文件被直接运行时,if name == 'main’之下的代码块将被运行;当.py文件以模块形式被导入时,if name == 'main’之下的代码块不被运行。
(注:(1)、import模块名【as别名】
(2)、from模块名 import对象名【as别名】
(3)、from模块名import*)
if __name__ == '__main__'
相当于Python模拟的程序入口,由于模块之间相互引用,不同的模块之间可能有类似的定义,但是程序的入口只有一个。所以到底从哪一个程序开始入口,就取决于__name__的值。
(注:程序入口:由于python本身语言的特性,他是从第一行开始运行,没有统一的入口,所以可确定一个入口来决定程序的进行)
1、构建URL
(1)、分析它的框架:
经过反复地观察发现它的工作界面在以下代码层次结构中:
<body class="b-list wanted-list qzzp-list header-fixed">
<div id= "wrapper">
<div class= "job-index-con mt10">
<div class= "f-hot">
<dl>
<dd>