爬虫流程(前面发过的文章的合集)巩固
1.打开网页
urllib.request.urlopen(\'网址\')
例:response = urllib.request.urlopen(\'http://www.baidu.com/\')
返回值为 <http.client.HTTPResponse object at 0x00000224EC2C9490>
2.获取响应头信息
urlopen 对象.getheaders()
例:response.getheaders()
返回值为 [(\'Bdpagetype\', \'1\'), (\'Bdqid\', \'0x8fa65bba0000ba44\'),···,(\'Transfer-Encoding\', \'chunked\')]
[(\'头\',\'信息\')]
3.获取响应头信息,带参数表示指定响应头
urlopen 对象.getheader(\'头信息\')
例:response.getheader(\'Content-Type\')
返回值为 \'text/html;charset=utf-8\'
4.查看状态码
urlopen 对象.status
例:response.status
返回值为 200 则表示成功
5.得到二进制数据,然后转换为 utf-8 格式
二进制数据
例:html = response.read()
HTML 数据格式
例:html = response.read().decode(\'utf-8\')
打印输出时,使用 decode(\'字符集\') 的数据 print(html.decode(\'utf-8\'))
6.存储 HTML 数据
fp = open(\'文件名.html\',\'模式 wb\')
例:fp = open(\'baidu.html\', \'wb\')
fp.write(response.read() 对象)
例:fp.write(html)
7.关闭文件
open对象.close()
例:fp.close()
8.使用 ssl 进行抓取 https 的网页
例:
import ssl
content = ssl._create_unverified_context()
headers = {\'User-Agent\':\'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36\'}
request = urllib.request.Request(\'http://www.baidu.com/\', headers = headers)
response = urllib.request.urlopen(request, context = context)
这里的 response 就和上面一样了
9.获取码
response.getcode()
返回值为 200
10.获取爬取的网页 url
response.geturl()
返回值为 https://www.baidu.com/
11.获取响应的报头信息
response.info()
12.保存网页
urllib.request.urlretrieve(url, \'文件名.html\')
例:urllib.request.urlretrieve(url, \'baidu.html\')
13.保存图片
urllib.request.urlretrieve(url, \'图片名.jpg\')
例:urllib.request.urlretrieve(url, \'Dog.jpg\')
其他字符(如汉字)不符合标准时,要进行编码
14.除了-._/09AZaz 都会编码
urllib.parse.quote()
例:
Param = "全文检索:*"
urllib.parse.quote(Param)
返回值为 \'%E5%85%A8%E6%96%87%E6%A3%80%E7%B4%A2%3A%2A\'
15.会编码 / 斜线(将斜线也转换为 %.. 这种格式)
urllib.parse.quote_plus(Param)
16.将字典拼接为 query 字符串 如果有中文,进行url编码
dic_object = {
\'user_name\':\'张三\',
\'user_passwd\':\'123456\'
}
urllib.parse.urlencode(dic_object)
返回值为 \'user_name=%E5%BC%A0%E4%B8%89&user_passwd=123456\'
17.获取 response 的行
url = \'http://www.baidu.com\'
response = urllib.request.urlopen(url)
response.readline()
18.随机获取请求头(随机包含请求头信息的列表)
user_agent = [
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv2.0.1) Gecko/20100101 Firefox/4.0.1",
"Mozilla/5.0 (Windows NT 6.1; rv2.0.1) Gecko/20100101 Firefox/4.0.1",
"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
"Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
]
ua = random.choice(user_agent)
headers = {\'User-Agent\':ua}
19.对输入的汉字进行 urlencode 编码
urllib.parse.urlencode(字典对象)
例:
chinese = input(\'请输入要查询的中文词语:\')
wd = {\'wd\':chinese}
wd = urllib.parse.urlencode(wd)
返回值为 \'wd=%E4%BD%A0%E5%A5%BD\'
20.常见分页操作
for page in range(start_page, end_page + 1):
pn = (page - 1) * 50
21.通常会进行拼接字符串形成网址
例:fullurl = url + \'&pn=\' + str(pn)
22.进行拼接形成要保存的文件名
例:filename = \'tieba/\' + name + \'贴吧_第\' + str(page) + \'页.html\'
23.保存文件
with open(filename,\'wb\') as f:
f.write(reponse.read() 对象)
24.headers 头信息可以删除的有
cookie、accept-encoding、accept-languag、content-length\connection\origin\host
25.headers 头信息不可以删除的有
Accept、X-Requested-With、User-Agent、Content-Type、Referer
26.提交给网页的数据 formdata
formdata = {
\'from\':\'en\',
\'to\':\'zh\',
\'query\':word,
\'transtype\':\'enter\',
\'simple_means_flag\':\'3\'
}
27.将formdata进行urlencode编码,并且转化为bytes类型
formdata = urllib.parse.urlencode(formdata).encode(\'utf-8\')
28.使用 formdata 在 urlopen() 中
response = urllib.request.urlopen(request, data=formdata)
29.转换为正确数据(导包 json)
read -> decode -> loads -> json.dumps
通过read读取过来为字节码
data = response.read()
将字节码解码为utf8的字符串
data = data.decode(\'utf-8\')
将json格式的字符串转化为json对象
obj = json.loads(data)
禁用ascii之后,将json对象转化为json格式字符串
html = json.dumps(obj, ensure_ascii=False)
json 对象通过 str转换后 使用 utf-8 字符集格式写入
保存和之前的方法相同
with open(\'json.txt\', \'w\', encoding=\'utf-8\') as f:
f.write(html)
30.ajax请求自带的头部
\'X-Requested-With\':\'XMLHttpRequest\'
31.豆瓣默认都得使用https来进行抓取,所以需要使用ssl模块忽略证书
例:
url = \'http://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action=\'
page = int(input(\'请输入要获取页码:\'))
start = (page - 1) * 20
limit = 20
key = {
\'start\':start,
\'limit\':limit
}
key = urllib.parse.urlencode(key)
url = url + \'&\' + key
headers = {
\'X-Requested-With\':\'XMLHttpRequest\',
\'User-Agent\':\'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36\'
}
request = urllib.request.Request(url, headers=headers)
# context = ssl._create_unverified_context()
response = urllib.request.urlopen(request)
jsonret = response.read()
with open(\'douban.txt\', \'w\', encoding=\'utf-8\') as f:
f.write(jsonret.decode(\'utf-8\'))
print(\'over\')
32.创建处理 http 请求的对象
http_handler = urllib.request.HTTPHandler()
33.处理 https 请求
https_handler = urllib.request.HTTPSHandler()
34.创建支持http请求的opener对象
opener = urllib.request.build_opener(http_handler)
35.创建 reponse 对象
例:opener.open(Request 对象)
request = urllib.request.Request(\'http://www.baidu.com/\')
reponse = opener.open(request)
进行保存
with open(\'文件名.html\', \'w\', encoding=\'utf-8\') as f:
f.write(reponse.read().decode(\'utf-8\'))
36.代理服务器
http_proxy_handler = urllib.request.ProxyHandler({\'https\':\'ip地址:端口号\'})
例:http_proxy_handler = urllib.request.ProxyHandler({\'https\':\'121.43.178.58:3128\'})
37.私密代理服务器(下面的只是一个例子,不一定正确)
authproxy_handler = urllib.request.ProxyHandler({"http" : "user:password@ip:port"})
38.不使用任何代理
http_proxy_handler = urllib.request.ProxyHandler({})
39.使用了代理之后的 opener 写法
opener = urllib.request.build_opener(http_proxy_handler)
40.response 写法
response = opener.open(request)
41.如果访问一个不存在的网址会报错
urllib.error.URLError
42.HTTPError(是URLError的子类)
例:
try:
urllib.request.urlopen(url)
except urllib.error.HTTPError as e:
print(e.code)
print(e.reason)
except urllib.error.URLError as e:
print(e)
43.使用 CookieJar 创建一个 cookie 对象,保存 cookie 值
import http.cookiejar
cookie = http.cookiejar.CookieJar( )
44.通过HTTPCookieProcessor构建一个处理器对象,用来处理cookie
cookie_handler = urllib.request.HTTPCookieProcessor(cookie)
opener 的写法
opener = urllib.request.build_opener(cookie_handler)
45.使用 r\'\x\' 消除转义
\d 表示转义字符 r\'\d\' 表示 \d
46.设置 正则模式
pattern = re.compile(r\'规则\', re.xxx )
pattern = re.compile(r\'i\s(.*?),\')
例:pattern = re.compile(r\'LOVE\', re.I)
使用 pattern 进行调用匹配
47.match 只匹配开头字符
pattern.match(\'字符串\'[,起始位置,结束位置])
例:m = pattern.match(\'i love you\', 2, 6)
返回值为 <re.Match object; span=(2, 6), match=\'love\'>
48. search 从开始匹配到结尾,返回第一个匹配到的
pattern.search(\'字符串\')
例:m = pattern.search(\'i love you, do you love me, yes, i love\')
返回值为 <re.Match object; span=(2, 6), match=\'love\'>
49.findall 将匹配到的都放到列表中
pattern.findall(\'字符串\')
例:m = pattern.findall(\'i love you, do you love me, yes, i love\')
返回值为 [\'love\', \'love\', \'love\']
50.split 使用匹配到的字符串对原来的数据进行切割
pattern.split(\'字符串\',次数)
例:m = pattern.split(\'i love you, do you love me, yes, i love me\', 1)
返回值为 [\'i \', \' you, do you love me, yes, i love me\']
例:m = pattern.split(\'i love you, do you love me, yes, i love me\', 2)
返回值为 [\'i \', \' you, do you \', \' me, yes, i love me\']
例:m = pattern.split(\'i love you, do you love me, yes, i love me\', 3)
返回值为 [\'i \', \' you, do you \', \' me, yes, i \', \' me\']
51.sub 使用新字符串替换匹配到的字符串的值,默认全部替换
pattern.sub(\'新字符串\',\'要匹配字符串\'[,次数])
注:返回的是字符串
例:
string = \'i love you, do you love me, yes, i love me\'
m = pattern.sub(\'hate\', string, 1)
m 值为 \'i hate you, do you love me, yes, i love me\'
52.group 匹配组
m.group() 返回的是匹配都的所有字符
m.group(1) 返回的是第二个规则匹配到的字符
例:
string = \'i love you, do you love me, yes, i love me\'
pattern = re.compile(r\'i\s(.*?),\')
m = pattern.match(string)
m.group()
返回值为 \'i love you,\'
m.group(1)
返回值为 \'love you\'
53.匹配标签
pattern = re.compile(r\'<div class="thumb">(.*?)<img src=(.*?) alt=(.*?)>(.*?)</div>\', re.S)
54.分离出文件名和扩展名,返回二元组
os.path.splitext(参数)
例:
获取路径
image_path = \'./qiushi\'
获取后缀名
extension = os.path.splitext(image_url)[-1]
55.合并多个字符串
os.path.join()
图片路径
image_path = os.path.join(image_path, image_name + extension)
保存文件
urllib.request.urlretrieve(image_url, image_path)
56.获取 a 标签下的 href 的内容
pattern = re.compile(r\'<a href="(.*?)" class="main_14" target="_blank">(.*?)</a>\', re.M)
57.href 中有中文的需要先进行转码,然后再拼接
smile_url = urllib.parse.quote(smile_url)
smile_url = \'http://www.jokeji.cn\' + smile_url
58.导入 etree
from lxml import etree
59.实例化一个 html 对象,DOM模型
etree.HTML
(通过requests库的get方法或post方法获取的信息 其实就是 HTML 代码)
例:html_tree = etree.HTML(text)
返回值为 <Element html at 0x26ee35b2400>
例:type(html_tree)
<class \'lxml.etree._Element\'>
60.查找所有的 li 标签
html_tree.xpath(\'//li\')
61.获取所有li下面a中属性href为link1.html的a
result = html_tree.xpath(\'//标签/标签[@属性="值"]\')
例:result = html_tree.xpath(\'//li/a[@href="link.html"]\')
62.获取最后一个 li 标签下 a 标签下面的 href 值
result = html_tree.xpath(\'//li[last()]/a/@href\')
63.获取 class 为 temp 的结点
result = html_tree.xpath(\'//*[@class = "temp"]\')
64.获取所有 li 标签下的 class 属性
result = html_tree.xpath(\'//li/@class\')
65.取出内容
[0].text
例:result = html_tree.xpath(\'//li[@class="popo"]/a\')[0].text
例:result = html_tree.xpath(\'//li[@class="popo"]/a/text()\')
66.将 tree 对象转化为字符串
etree.tostring(etree.HTML对象).decode(\'utf-8\')
67.动态保存图片,使用url后几位作为文件名
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
html_tree = etree.HTML(html)
img_list = html_tree.xpath(\'//div[@class="box picblock col3"]/div/a/img/@src2\')
for img_url in img_list:
# 定制图片名字为url后10位
file_name = \'image/\' + img_url[-10:]
load_image(img_url, file_name)
load_image内容:
def load_image(url, file_name):
headers = {
\'User-Agent\':\'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36\',
}
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
image_bytes = response.read()
with open(file_name, \'wb\') as f:
f.write(image_bytes)
print(file_name + \'图片已经成功下载完毕\')
例:
def load_page(url):
headers = {
#\'User-Agent\':\'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36\',
}
print(url)
# exit()
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
html = response.read()
# 这是专业的图片网站,使用了懒加载,但是可以通过源码来进行查看,并且重新写xpath路径
with open(\'7image.html\', \'w\', encoding=\'utf-8\') as f:
f.write(html.decode(\'utf-8\'))
exit()
# 将html文档解析问DOM模型
html_tree = etree.HTML(html)
# 通过xpath,找到需要的所有的图片的src属性,这里获取到的
img_list = html_tree.xpath(\'//div[@class="box picblock col3"]/div/a/img/@src2\')
for img_url in img_list:
# 定制图片名字为url后10位
file_name = \'image/\' + img_url[-10:]
load_image(img_url, file_name)
def load_image(url, file_name):
headers = {
\'User-Agent\':\'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36\',
}
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
image_bytes = response.read()
with open(file_name, \'wb\') as f:
f.write(image_bytes)
print(file_name + \'图片已经成功下载完毕\')
def main():
start = int(input(\'请输入开始页面:\'))
end = int(input(\'请输入结束页面:\'))
url = \'http://sc.chinaz.com/tag_tupian/\'
for page in range(start, end + 1):
if page == 1:
real_url = url + \'KaTong.html\'
else:
real_url = url + \'KaTong_\' + str(page) + \'.html\'
load_page(real_url)
print(\'第\' + str(page) + \'页下载完毕\')
if __name__ == \'__main__\':
main()
68.懒图片加载案例
例:
import urllib.request
from lxml import etree
import json
def handle_tree(html_tree):
node_list = html_tree.xpath(\'//div[@class="detail-wrapper"]\')
duan_list = []
for node in node_list:
# 获取所有的用户名,因为该xpath获取的是一个span列表,然后获取第一个,并且通过text属性得到其内容
user_name = node.xpath(\'./div[contains(@class, "header")]/a/div/span[@class="name"]\')[0].text
# 只要涉及到图片,很有可能都是懒加载,所以要右键查看网页源代码,才能得到真实的链接
# 由于这个获取的结果就是属性字符串,所以只需要加上下标0即可
face = node.xpath(\'./div[contains(@class, "header")]//img/@data-src\')[0]
# .代表当前,一个/表示一级子目录,两个//代表当前节点里面任意的位置查找
content = node.xpath(\'./div[@class="content-wrapper"]//p\')[0].text
zan = node.xpath(\'./div[@class="options"]//li[@class="digg-wrapper "]/span\')[0].text
item = {
\'username\':user_name,
\'face\':face,
\'content\':content,
\'zan\':zan,
}
# 将其存放到列表中
duan_list.append(item)
# 将列表写入到文件中
with open(\'8duanzi.txt\', \'a\', encoding=\'utf-8\') as f:
f.write(json.dumps(duan_list, ensure_ascii=False) + \'\n\')
print(\'over\')
def main():
# 爬取百度贴吧,不能加上headers,加上headers爬取不下来
url = \'http://neihanshequ.com/\'
headers = {
\'User-Agent\':\'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36\',
}
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
html_bytes = response.read()
# fp = open(\'8tieba.html\', \'w\', encoding=\'utf-8\')
# fp.write(html_bytes.decode(\'utf-8\'))
# fp.close()
# exit()
# 将html字节串转化为html文档树
# 文档树有xpath方法,文档节点也有xpath方法
# 【注】不能使用字节串转化为文档树,这样会有乱码
html_tree = etree.HTML(html_bytes.decode(\'utf-8\'))
handle_tree(html_tree)
if __name__ == \'__main__\':
main()
69. . / 和 // 在 xpath 中的使用
.代表当前目录
/ 表示一级子目录
// 代表当前节点里面任意的位置
70.获取内容的示范
获取内容时,如果为字符串,则不需要使用 text 只需要写[0]
face = node.xpath(\'./div[contains(@class, "header")]//img/@data-src\')[0]
div 下 class 为 "content-wrapper" 的所有 p 标签内容
content = node.xpath(\'./div[@class="content-wrapper"]//p\')[0].text
div 下 class 为 "options" 的所有 li 标签下 class为 "digg-wrapper" 的所有 span 标签内容
zan = node.xpath(\'./div[@class="options"]//li[@class="digg-wrapper"]/span\')[0].text
71.将json对象转化为json格式字符串
f.write(json.dumps(duan_list, ensure_ascii=False) + \'\n\')
72.正则获取 div 下的内容
1.获取 div 到 img 之间的数据
2.img 下 src 的数据
3.img 下 alt 的数据
4.一直到 div 结束的数据
pattern = re.compile(r\'<div class="thumb">(.*?)<img src=(.*?) alt=(.*?)>(.*?)</div>\', re.S)
pattern.方法 ,参考上面的正则
73.带有参数的 get 方式
import requests
params = {
\'wd\':\'中国\'
}
r = requests.get(\'http://www.baidu.com/s?\', headers=headers, params=params)
requests.get 还可以添加 cookie 参数
74.设置编码
r.encoding=\'utf-8
75.查看所有头信息
r.request.headers
76.在 requests.get 方法中 url,params,headers,proxies 为参数
url 网址 params 需要的数据 headers 头部 proxies 代理
77.通过 Session 对象,发送请求
s = requests.Session()
78.发送请求
s.post(url,data,headers)
79.接收请求
s.get(url[,proxies])
80.当返回为 json 样式时
例:
city = input(\'请输入要查询的城市:\')
params = {
\'city\':city
}
r = requests.get(url, params=params)
r.json() 会打印出响应的内容
81.BeautifulSoup 创建对象
from bs4 import BeautifulSoup
soup = BeautifulSoup(open(url,encoding=\'utf-8),\'lxml\')
82.查找第一个<title> 标签
soup.title
返回值为 <title>三国猛将</title>
83.查找第一个 a 标签
soup.a
返回值为 <a class="aa" href="http://www.baidu.com" title="baidu">百度</a>
84.查找第一个 ul 标签
soup.ul
85.查看标签名字
a_tag = soup.a
a_tag.name
返回值为 a
86.查看标签内容
a_tag.attrs
返回值为 {\'href\': \'http://www.baidu.com\', \'title\': \'baidu\', \'class\': [\'aa\']}
87.获取找到的 a 标签的 href 内容(第一个 a)
soup.a.get(\'href\')
返回值为 http://www.baidu.com
88.获取 a 标签下的 title 属性(第一个 a)
soup.a.get(\'title\')
返回值为 baidu
89.查看 a 标签下的内容
soup.标签.string 标签还可以是 head、title等
soup.a.string
返回值为 百度
90.获取 p 标签下的内容
soup.p.string
91.查看 div 的内容,包含 \'\n\'
soup.div.contents
返回值为
[\'\n\', <div class="div">
<a class="la" href="www.nihao.com">你好</a>
</div>, \'\n\', <div>
<a href="www.hello.com">世界</a>
</div>, \'\n\']
92.查看使用的字符集
soup.div.contents[1]
返回值为 <meta charset="utf-8"/>
93.查看body的子节点
soup.标签.children
例:soup.body.children
返回值是一个迭代对象,需要遍历输出
返回值为 <list_iterator object at 0x0000021863886C10>
for child in soup.body.children:
print(child)
返回值为 body 中的所有内容
94.查看所有的子孙节点
soup.标签.descendants
例:soup.div.descendants
返回值为
<div class="div">
<a class="la" href="www.nihao.com">你好</a>
</div>
<a class="la" href="www.nihao.com">你好</a>
你好
95.查看所有的 a 标签
soup.find_all(\'a\')
返回值为 包含所有的 a 标签的列表
96.查看 a 标签中第二个链接的内容
soup.find_all(\'a\')[1].string
97.查看 a 标签中第二个链接的href值
soup.find_all(\'a\')[1].href
98.将 re 正则嵌入进来,找寻所有以 b 开头的标签
soup.findall(re.compile(\'^b\'))
返回值为 <body>标签 <b>
99.找到所有的 a 标签和 b 标签
soup.findall(re.compile([\'a\',\'b\']))
返回值为 <a> 和 <b> 标签
100.通过标签名获取所有的 a 标签
soup.select(\'a\')
返回值为 所有的 <a> 标签
101.通过 类名 获取标签(在 class 等于的值前面加 .)
soup.select(\'.aa\')
返回值为 class=\'aa\' 的标签
102.通过 id 名获取标签(在 id 等于的值前面加 #)
soup.select(\'#wangyi\')
返回值为 id=\'wangyi\'的标签
103.查看 div 下 class=\'aa\' 的标签
soup.select(\'标签 .class 等于的值\')
soup.select(\'div .aa\')
104.查看 div 下,第一层 class=\'aa\' 的标签
soup.select(\'.标签名 > .class= 的值\')
soup.select(\'.div > .la\')
105.根据属性进行查找,input 标签下class为 haha 的标签
soup.select(\'input[class="haha"]\')
例:
import requests
from bs4 import BeautifulSoup
import json
import lxml
def load_url(jl, kw):
headers = {
\'User-Agent\':\'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36\',
}
url = \'http://sou.zhaopin.com/jobs/searchresult.ashx?\'
params = {
\'jl\':jl,
\'kw\':kw,
}
# 自动完成转码,直接使用即可
r = requests.get(url, params=params, headers=headers)
handle_data(r.text)
def handle_data(html):
# 创建soup对象
soup = BeautifulSoup(html, \'lxml\')
# 查找职位名称
job_list = soup.select(\'#newlist_list_content_table table\')
# print(job_list)
jobs = []
i = 1
for job in job_list:
# 因为第一个table只是表格的标题,所以要过滤掉
if i == 1:
i = 0
continue
item = {}
# 公司名称
job_name = job.select(\'.zwmc div a\')[0].get_text()
# 职位月薪
company_name = job.select(\'.gsmc a\')[0].get_text()
# 工作地点
area = job.select(\'.gzdd\')[0].get_text()
# 发布日期
time = job.select(\'.gxsj span\')[0].get_text()
# 将所有信息添加到字典中
item[\'job_name\'] = job_name
item[\'company_name\'] = company_name
item[\'area\'] = area
item[\'time\'] = time
jobs.append(item)
# 将列表转化为json格式字符串,然后写入到文件中
content = json.dumps(jobs, ensure_ascii=False)
with open(\'python.json\', \'w\', encoding=\'utf-8\') as f:
f.write(content)
print(\'over\')
def main():
# jl = input(\'请输入工作地址:\')
# kw = input(\'请输入工作职位:\')
load_url(jl=\'北京\', kw=\'python\')
if __name__ == \'__main__\':
main()
106.将字典进行 json 转换为
import json
str_dict = {"name":"张三", "age":55, "height":180}
print(json.dumps(str_dict, ensure_ascii=False))
使用 ensure_ascii 输出则为 utf-8 编码
107.读取转换的对象,(注意 loads 和 load 方法)
json.loads(json.dumps 对象)
string = json.dumps(str_dict, ensure_ascii=False)
json.loads(string)
{"name":"张三", "age":55, "height":180}
108.将对象序列化之后写入文件
json.dump(字典对象,open(文件名.json,\'w\',encoding=\'utf-8,ensure_ascii=False))
json.dump(str_dict, open(\'jsontest.json\', \'w\', encoding=\'utf-8\'), ensure_ascii=False)
109.转换本地的 json 文件转换为 python 对象
json.load(open(\'文件名.json\',encoding=\'utf-8))
110.jsonpath 示例:
book.json文件
{
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}
import json
import jsonpath
obj = json.load(open(\'book.json\', encoding=\'utf-8\'))
所有book
book = jsonpath.jsonpath(obj, \'$..book\')
print(book)
所有book中的所有作者
authors = jsonpath.jsonpath(obj, \'$..book..author\')
print(authors)
book中的前两本书 \'$..book[:2]\'
book中的最后两本书 \'$..book[-2:]\'
book = jsonpath.jsonpath(obj, \'$..book[0,1]\')
print(book)
所有book中,有属性isbn的书籍
book = jsonpath.jsonpath(obj, \'$..book[?(@.isbn)]\')
print(book)
所有book中,价格小于10的书籍
book = jsonpath.jsonpath(obj, \'$.store.book[?(@.price<10)]\')
print(book)
111.requests.get 方法的流程
r = requests.get(\'https://www.baidu.com/\').content.decode(\'utf-8\')
从状态码到 二进制码到 utf-8 编码
112.对 soup 对象进行美化
html = soup.prettify()
<title>
百度一下,你就知道
</title>
113.将内容 string 化
html.xpath(\'string(//*[@id="zmdao_post_body"])\')
114.获取属性
soup.p[\'name\']
115.嵌套选择
soup.head.title.string
116.获取父节点和祖孙节点
soup.a.parent
list(enumerate(soup.a.parents))
117.获取兄弟节点
soup.a.next_siblings
list(enumerate(soup.a.next_siblings))
soup.a.previous_siblings
list(enumerate(soup.a.previous_siblings))
118.按照特定值查找标签
查找 id 为 list-1 的标签
soup.find_all(attrs={\'id\': \'list-1\'})
soup.find_all(id=\'list-1\')
119.返回父节点
find_parents()返回所有祖先节点
find_parent()返回直接父节点
120.返回后面兄弟节点
find_next_siblings()返回后面所有兄弟节点
find_next_sibling()返回后面第一个兄弟节点。
121.返回前面兄弟节点
find_previous_siblings()返回前面所有兄弟节点
find_previous_sibling()返回前面第一个兄弟节点。
122.返回节点后符合条件的节点
find_all_next()返回节点后所有符合条件的节点
find_next()返回第一个符合条件的节点
123.返回节点前符合条件的节点
find_all_previous()返回节点前所有符合条件的节点
find_previous()返回第一个符合条件的节点
124.requests 的请求方式
requests.post(url)
requests.put(url)
requests.delete(url)
requests.head(url)
requests.options(url)
125.GET请求
response = requests.get(url)
print(response.text)
126.解析 json
response.json()
json.loads(response.text)
127.发送 post 请求
response = requests.post(url, data=data, headers=headers)
response.json()
128.文件上传
在 post 方法内部添加参数 files 字典参数
import requests
files = {\'file\': open(\'favicon.ico\', \'rb\')}
response = requests.post("http://httpbin.org/post", files=files)
print(response.text)
129.获取 cookie
response.cookie
返回值是 字典对象
for key, value in response.cookies.items():
print(key + \'=\' + value)
130.模拟登录
requests.get(\'http://httpbin.org/cookies/set/number/123456789\')
response = requests.get(\'http://httpbin.org/cookies\')
131.带有 Session 的登录
s = requests.Session()
s.get(\'http://httpbin.org/cookies/set/number/123456789\')
response = s.get(\'http://httpbin.org/cookies\')
132.证书验证
urllib3.disable_warnings()
response = requests.get(\'https://www.12306.cn\', verify=False)
response = requests.get(\'https://www.12306.cn\', cert=(\'/path/server.crt\', \'/path/key\'))
133.超时设置
from requests.exceptions import ReadTimeout
response = requests.get("http://httpbin.org/get", timeout = 0.5)
response = urllib.request.urlopen(url, timeout=1)
134.认证设置
from requests.auth import HTTPBasicAuth
r = requests.get(\'http://120.27.34.24:9001\', auth=HTTPBasicAuth(\'user\', \'123\'))
r = requests.get(\'http://120.27.34.24:9001\', auth=(\'user\', \'123\'))
135.异常处理
超时 ReadTimeout
连接出错 ConnectionError
错误 RequestException
136.URL 解析
from urllib.parse import urlparse
result = urlparse(\'http://www.baidu.com/index.html;user?id=5#comment\')
result = urlparse(\'www.baidu.com/index.html;user?id=5#comment\', scheme=\'https\')
result = urlparse(\'http://www.baidu.com/index.html;user?id=5#comment\',allow_fragments=False)
136.urllib.parse.urlunparse
data = [\'http\', \'www.baidu.com\', \'index.html\', \'user\', \'a=6\', \'comment\']
print(urlunparse(data))
http://www.baidu.com/index.html;user?a=6#comment
137.合并 url
urllib.parse.urljoin
urljoin(\'http://www.baidu.com\', \'FAQ.html\')
http://www.baidu.com/FAQ.html
urljoin(\'www.baidu.com#comment\', \'?category=2\')
www.baidu.com?category=2
2020-06-04
版权声明:本文为hany-postq473111315原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。