python 爬虫
爬取笑话、热评、图片
感谢,如需转载请注明文章出处:https://blog.csdn.net/weixin_44609873/article/details/103691024
Python 网络爬虫简单教程——第一部
Python 网络爬虫简单教程——第二部
Python 网络爬虫简单教程——第三部
19年 12月 24日
又是闲暇好时光,坐下来喝喝茶,码码代码,程序员的世界就是这么奢华且枯燥!
上两部分,我们一起探讨了 爬虫的定义 与 实际意义,以及请求网页得到源码,再爬取百度链接等。
今天呢 我们一起来探讨一下
—把喜欢的笑话段子爬到本地
—爬取电影《小丑》豆瓣热评
—用爬虫爬取想要的图片并保存到本地
(=爬取视频= 后续我会单独写一个博客,因为爬取视频可能会牵扯到视频网站维权问题,会侵删,如果爬视频博客没了,欢迎私聊找我。
)
我们先来看看爬取内容:
01.小保姆嗓门特别大,主人叮嘱,今晚来的都是有身份的人,说话务必小声一点。吃完饭,主人客人玩牌,小保姆收拾完想早点休息,于是凑近男主人耳边轻声道:“那我先睡了哈。”
02.有妞不泡,大逆不道。见妞就泡,替天行道。胸脯高高,越摸越骚。小腰细细,身怀绝技。身材小巧,没完没了。屁股翘翘,要完还要。
03.小夫妻一夜欢欲。事毕,老公去洗手间认真的清洗擦拭,妻问干嘛那么久?老公说:狙击枪用完就要保养,我的兄弟叫顺溜…
狙击枪用完要保养 还顺溜 、、、
可以说这个网站的 “笑话” 不可谓不淫荡。
哪个网站呢?
笑话集 http://www.jokeji.cn/
我们随便找一个笑话进去爬取比如 十个爆笑段子,不笑不要钱
网站:http://www.jokeji.cn/jokehtml/bxnn/20090926220449.htm
这个也就是我们需要爬取网站 url ,接下来我们点进去,按 f12
进入开发者模式看看能否发现宝藏
果然,这样我们发现其实需要爬取的内容全部都在 里面,如下图
因此我们就可以写 、
东西了
pycharm
中新建 PcJoke.py
码入代码
"""
爬取笑话网笑话
爱娶媳妇的苗同学
"""
# 爬取笑话集笑话
import requests
from bs4 import BeautifulSoup
# 获取html文档
def get_html(url):
"""get the content of the url"""
response = requests.get(url)
response.encoding = 'gbk' #中文编码
return response.text
# 获取笑话并返回
def get_certain_joke(html):
"""get the joke of the html"""
soup = BeautifulSoup(html, 'lxml')
joke_content = soup.select('#text110')[0].get_text() #get_text() 可以获取 span 标签内文本
return joke_content
url_joke = "http://www.jokeji.cn/jokehtml/bxnn/20090926220449.htm"
html = get_html(url_joke)
joke_content = get_certain_joke(html)
print(joke_content)
代码解析:首先还是请求网页获得网页源代码,我们加了一句response.encoding = 'gbk'
, ’gbk‘
支持中文编码,其实就是把源代码中文字显示出来,不然文字编译会乱码。
然后用 soup = BeautifulSoup(html, 'lxml')
解析源码并获取所需笑话内容
其中的 get_text()
是获取span 标签内文本的,也就是笑话内容。
如果没有汉字编码 response.encoding = 'gbk'
获取了内容 ,我们就要开始存储了,便于以后我们 浏览 运送等
储存代码
#存储笑话文件
def save(text):
with open('D:\新建文件夹\Joke.txt','w') as f:
f.write(text)
print("存储已完成!")
这样就把文件存储到 D:\新建文件夹\Joke.txt
中了
最后爬取笑话集,完整代码
"""
爬取笑话网笑话
爱娶媳妇的苗同学
"""
# 爬取笑话集笑话
import requests
from bs4 import BeautifulSoup
# 获取html文档
def get_html(url):
"""get the content of the url"""
response = requests.get(url)
response.encoding = 'gbk' #中文编码
return response.text
# 获取笑话
def get_certain_joke(html):
"""get the joke of the html"""
soup = BeautifulSoup(html, 'lxml')
joke_content = soup.select('#text110')[0].get_text()
text = " " #新建文本用于存放笑话
text += text + joke_content
return text
#存储笑话文件
def save(text):
with open('D:\新建文件夹\Joke.txt','w') as f:
f.write(text)
print("存储已完成!")
url_joke = "http://www.jokeji.cn/jokehtml/bxnn/20090926220449.htm"
html = get_html(url_joke)
joke_content = get_certain_joke(html)
save(joke_content)
前段时间,小丑是沸沸扬扬,出于好奇,晚上爬了这个视频来看,视频打开了,好朋友请吃饭,出门,回来小丑已经放完,我也就理所应当的看完了(▽)
直接进 小丑热评:https://movie.douban.com/subject/27119724/comments
这就是我们需要爬取的东西,点进去 狠狠按 f12
一目了然了吧,我们需要的 影评人 和 影评内容 都在,没得跑,分析过后,我们便可以着手了干一把了
import requests
from bs4 import BeautifulSoup
html = requests.get('https://movie.douban.com/subject/27119724/comments')
print(html)
运行这两行代码,大家认为网页请求正确吗?
——应该正确是吧,可是
而非
,为什么呢?
——之前我在爬虫第二部分提到过,有些网站不欢迎不明东西比如爬虫来访问自己,会拒绝,这时就需要我们引入:User-Agen
, 这个东西在网站开发者下Network——Headers
中可以找到。
小丑热评https://movie.douban.com/subject/27119724/comments
f12
下
这里便是你的 User-Agen
,比如我的是:
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
其实就在告诉网站 我是什么来访问你? 电脑 还是 手机? 型号、浏览器等,
我们把自己的 User-Agen
放上去 ,请求网站便以为我们是浏览器的正常访问,就会放我们通过啦,从而达到隐藏我们 python 爬虫
的身份。
import requests
from bs4 import BeautifulSoup
headers = {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
}
html = requests.get('https://movie.douban.com/subject/27119724/comments',headers = headers)
print(html)
访问正常我们便可以着手接下来的动作了
我们发现 热评内容信息在类 short 中、影评人信息在类 avatar 里标签 a 中 ,于是我们可以这样
"""
爱娶媳妇的苗同学
爬取小丑热评
"""
# import urllib2
import requests
from bs4 import BeautifulSoup
headers = {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
}
html = requests.get('https://movie.douban.com/subject/27119724/comments',headers = headers)
print(html)
html_text = html.text
soup = BeautifulSoup(html_text,'lxml')
hot_content_list = soup.select('.short') #热评内容信息在类 short 中
hot_title_list = soup.select('.avatar a') #影评人信息在类 avatar 里标签 a 中
title_list = [] #影评人信息数组
content_list = [] #热评内容信息数组
# 得到影评人内容
for access in hot_title_list:
title = access.get('title')
title_list.append(title)
# 得到热评价内容
for content in hot_content_list:
final_content = content.get_text()
content_list.append(final_content)
# 存储爬取内容
text = ''
for i in range(0,len(title_list)):
text += '\n影评人: ' + title_list[i] + '\n评价: ' +content_list[i]
with open('D:/新建文件夹/Xiaoc.txt','w') as f:
f.write(text)
print("储存已完成")
注意:图片和视频都是以二进制在计算机上存储的 ,因为计算机六亲不认,只识 0 1
。
1、目标url :健身瑜伽图片:https://www.pexels.com/zh-tw/search/%E5%81%A5%E8%BA%AB%E7%91%9C%E4%BC%BD/
2、同样我们 f12
找到源代码
我们发现 img 标签下 srcset 里面这个特别像图片链接,我们可以大胆假设是,并且复制到浏览器去验证下
正好就是,这样 我们的目标就确认下来了,接下来就是写相应代码啦(温馨提示:不要被网页内容所干扰,认真搞代码
)
"""
爱娶媳妇的苗同学
爬虫爬取 pexels 上图片
"""
import requests
from bs4 import BeautifulSoup
html = requests.get('https://www.pexels.com/zh-tw/search/%E5%81%A5%E8%BA%AB%E7%91%9C%E4%BC%BD/')
# 将获取的图片地址依次放入img_url中
img_url = []
soup = BeautifulSoup(html.text, 'lxml')
#获取图url并且存放img_url数组
for img in soup.select('.photo-item__img'):
# srcset 是 img标签中存在的属性
final_img_path = img.get('srcset')
img_url.append(final_img_path)
print(img_url) #输出 count 数组
print("总共有 %d 张"%len(img_url)) #数组元素大小等于图片个数
网页解析:
从这我们可以看出 图片是放在类 photo-item__img
中的
于是我们先用 soup.select('.photo-item__img')
再通过 get('srcset'
) 来锁定图片 url 位置
最后放入 img_url
数组里,以便后续挨个遍历请求图片
运行结果:
成功获得图片 url 之后动动手指再加个保存:
完成代码:
"""
爱娶媳妇的苗同学
爬虫爬取 pexels 上图片
"""
import requests
from bs4 import BeautifulSoup
html = requests.get('https://www.pexels.com/zh-tw/search/%E5%81%A5%E8%BA%AB%E7%91%9C%E4%BC%BD/')
# 将获取的图片地址依次放入img_url中
img_url = []
soup = BeautifulSoup(html.text, 'lxml')
#获取图url并且存放img_url数组
for img in soup.select('.photo-item__img'):
# srcset 是 img标签中存在的属性
img_path = img.get('srcset')
img_url.append(img_path)
print(img_url) #输出 count 数组
print("总共有 %d 张"%len(img_url)) #数组元素大小等于图片个数
# 用enumerate依次取出count中的图片地址 放入v中
for i, v in enumerate(img_url):
# 将获取的 url(v) 放入request中请求
image = requests.get(v)
# 存取图片过程中,出现不能存储 int 类型,故而,我们对他进行类型转换 str() wb:二进制进行读写。
with open('D:\爬虫图片文件\img' + str(i) + '.jpg', 'wb') as file:
# content:图片转换成二进制,进行保存。
file.write(image.content)
print("已完成第","张",sep=str(i))
with open('D:\爬虫图片文件\img' + str(i) + '.jpg', 'wb') as file:
因为图片是二进制在计算机中储存的所以这里有 wb
方式,即二进制读写
夜深了脖子却疼了,晚安!
谢谢观看!
2019.12.25