目录
欢迎关注 『Python黑科技』 系列,持续更新中
欢迎关注 『Python黑科技』 系列,持续更新中
实现效果
爬取的内容
得到的csv文件
实现思路
- 导入所用的相关库
- 分析并得到爬取关键词的url网址
- 获取一个随机的user_agent(headers的使用使得)
- 访问网页并爬取句子-句子的作者-句子的出处,把这三个内容封装进2层的list中
- 把list存入csv文件中,持久化保存
导入所用的相关库
import requests
from lxml import etree
import csv
import random
分析并得到爬取关键词的url网址
我们搜索关键字程序员
得到的url是https://www.juzikong.com/s?q=程序员
多尝试几个其他的关键词,得知修改了q=程序员
就会搜索其他的关键词,分析之后找到了这个关键词的爬虫key
因为编码的问题,程序员
三个字转化为了 %E7%A8%8B%E5%BA%8F%E5%91%98
#https://www.juzikong.com/s?q=程序员
#因为url编码要转变的原因,你从浏览器复制黏贴下来会自动变成下面的结果->
url = "https://www.juzikong.com/s?q=%E7%A8%8B%E5%BA%8F%E5%91%98"
获取一个随机的user_agent(引入随机headers反爬)
具体可以查看另一篇博文:
# 得到随机的一个请求头
def get_random_user_agent():
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",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
"Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
"Mozilla/5.0 (Windows NT 6.1; rv:2.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",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
"Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
"Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
"Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
"Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10",
"Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
"Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+",
"Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0",
"Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)",
"UCWEB7.0.2.37/28/999",
"NOKIA5700/ UCWEB7.0.2.37/28/999",
"Openwave/ UCWEB7.0.2.37/28/999",
"Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999",
# iPhone 6:
"Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25",
]
return random.choice(user_agent)
# headers 使用
headers = {'User-Agent': get_random_user_agent()}
访问网页并爬取句子-句子的作者-句子的出处,把这三个内容封装进2层的list中
谷歌浏览器下右键检查获取要爬取的内容的xpth
复制完整xpth
整体区域xpth/html/body/div/div/div/div[3]/main/div[2]
#先获取要爬取的名言的整体的每一个个体,然后迭代每个句子的message,author,source
queto_list = html.xpath('/html/body/div/div/div/div[3]/main/div[2]/section')
句子内容xpth
/html/body/div[1]/div/div/div[3]/main/div[2]/section[1]/div[2]/a/span[1]/span/span
作者内容xpth
/html/body/div[1]/div/div/div[3]/main/div[2]/section[16]/div[2]/div/span/a/span/span
出处内容xpth
/html/body/div[1]/div/div/div[3]/main/div[2]/section[16]/div[2]/div/a/span/span
这个时候我们会得到
# 先获取要爬取的名言的整体,然后再获取整体下面的每一条名言的message,author,source
queto_list = html.xpath('/html/body/div/div/div/div[3]/main/div[2]/section')
lists = []
print("得到的句子内容:")
for queto in queto_list:
# 名言正文 /section[1]/div[2]/a/span[1]/span/span
message = queto.xpath('./div[2]/a/span[1]/span/span/text()')
# 作者 /section[16]/div[2]/div/span/a/span/span 不一定每个句子都有作者
authuor = queto.xpath('./div[2]/div/span/a/span/span/text()')
# 出处 /section[16] / div[2] / div / a / span / span 不一定每个句子都有出处
source = queto.xpath('./div[2] / div / a / span / span/text()')
# 将数据统一添加进列表中保存
lists.append(message)
lists.append(authuor)
lists.append(source)
但是你会发现,因为搜索关键字的原因,这个网站把我们程序员的关键词的内容给分割了,所以我们还要把message的list变成字符串,比如说:
['我以后是', '程序员', '的话....']应该被转化为['我以后是程序员的话....']
修改后
# 先获取要爬取的名言的整体,然后再获取整体下面的每一条名言的message,author,source
queto_list = html.xpath('/html/body/div/div/div/div[3]/main/div[2]/section')
lists = []
print("得到的句子内容:")
for queto in queto_list:
# 名言正文 /section[1]/div[2]/a/span[1]/span/span
message = queto.xpath('./div[2]/a/span[1]/span/span/text()')
# 作者 /section[16]/div[2]/div/span/a/span/span 不一定每个句子都有作者
authuor = queto.xpath('./div[2]/div/span/a/span/span/text()')
# 出处 /section[16] / div[2] / div / a / span / span 不一定每个句子都有出处
source = queto.xpath('./div[2] / div / a / span / span/text()')
# 将数据统一添加进列表中保存
this_list = []
str_message = ''.join(message)
this_list.append(str_message)
str_authuor = ''.join(authuor)
this_list.append(str_authuor)
str_source = ''.join(source)
this_list.append(str_source)
# print(this_list)#打印本句子的所有信息
lists.append(this_list)
#测试输出保存的数据
print(lists)
把list存入csv文件中,持久化保存
with open("./名人名言.csv", 'w', encoding='utf-8', newline='\n') as f:
writer = csv.writer(f)
for i in lists:
writer.writerow(i)
实现代码
完整的实现代码,拿来即用
# @Time : 2022/2/1 17:45
# @Author : 南黎
# @FileName: Python爬虫爬取句子迷句子.py
import requests
from lxml import etree
import csv
import random
# https://www.juzikong.com/s?q=程序员
# 因为url编码要转变的原因,你复制下来应该是下面的结果 程序员 三个字转化为了 %E7%A8%8B%E5%BA%8F%E5%91%98
url = "https://www.juzikong.com/s?q=%E7%A8%8B%E5%BA%8F%E5%91%98"
# 得到随机的一个请求头
def get_random_user_agent():
user_agent = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
]
return random.choice(user_agent)
# headers 使用
headers = {'User-Agent': get_random_user_agent()}
print("使用的随机浏览器头:")
print(headers)
get_request = requests.get(url=url, headers=headers).text
# html:爬取得到的网页html内容
html = etree.HTML(get_request)
# 先获取要爬取的名言的整体,然后再获取整体下面的每一条名言的message,author,source
queto_list = html.xpath('/html/body/div/div/div/div[3]/main/div[2]/section')
lists = []
print("得到的句子内容:")
for queto in queto_list:
# 名言正文 /section[1]/div[2]/a/span[1]/span/span
message = queto.xpath('./div[2]/a/span[1]/span/span/text()')
# 作者 /section[16]/div[2]/div/span/a/span/span 不一定每个句子都有作者
authuor = queto.xpath('./div[2]/div/span/a/span/span/text()')
# 出处 /section[16] / div[2] / div / a / span / span 不一定每个句子都有出处
source = queto.xpath('./div[2] / div / a / span / span/text()')
# 将数据统一添加进列表中保存
this_list = []
str_message = ''.join(message)
this_list.append(str_message)
str_authuor = ''.join(authuor)
this_list.append(str_authuor)
str_source = ''.join(source)
this_list.append(str_source)
# print(this_list)#打印本句子的所有信息
lists.append(this_list)
# 测试输出保存的数据
print(lists)
with open("./名人名言.csv", 'w', encoding='utf-8', newline='\n') as f:
writer = csv.writer(f)
for i in lists:
writer.writerow(i)
总结
大家喜欢的话,给个👍,点个关注!给大家分享更多有趣好玩的Python黑科技!
版权声明:
发现你走远了@mzh原创作品,转载必须标注原文链接
Copyright 2022 mzh
Crated:2022-2-1
欢迎关注 『Python黑科技』 系列,持续更新中
欢迎关注 『Python黑科技』 系列,持续更新中
【Python安装第三方库一行命令永久提高速度】
【使用PyInstaller打包exe】
【免登陆爬虫一键下载知乎文章图片(保姆级图文+实现代码)】
【孤独的程序员和AI机器人朋友聊天解闷(免费接口+保姆级图文+实现代码注释)】
【几行代码绘制gif动图(保姆级图文+实现代码)】
【几行代码实现网课定时循环截屏,保存重要知识点(保姆级图文+实现代码)】
【常用的user_agent 浏览器头爬虫模拟用户(保姆级图文+实现代码)】
【更多内容敬请期待】