爬取网站招聘信息代码解析


(刚刚打完了一遍,不知道怎么搞得,粘贴一个文本时,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>

猜你喜欢

转载自blog.csdn.net/weixin_43901038/article/details/88771108