网页爬虫抓取百度图片(项目工具Python3.7.1、JetBrainsPyCharm三、项目过程(四))
优采云 发布时间: 2022-02-05 03:09网页爬虫抓取百度图片(项目工具Python3.7.1、JetBrainsPyCharm三、项目过程(四))
需要编写的程序可以在任意一个贴吧页面获取帖子链接,抓取用户在帖子中发布的图片。在这个过程中,通过用户代理进行伪装和轮换,解决了爬虫ip被目标网站封禁的问题。熟悉基本的网页和url分析,能灵活使用Xmind工具分析Python爬虫(网络爬虫)的流程图。
一、项目分析
1. 网络分析
贴吧页面简洁,所有内容一目了然,比其他社区论坛更容易使用。注册容易,甚至不注册,发布也容易。但是,栏目创建不均,内容五花八门。
2. 网址解析
分析贴吧中post链接的拼接形式,在程序中重构post链接。
比如在本例的实验中,多次输入不同的贴吧后,可以看出贴吧的链接组成为:fullurl=url+key。其中 fullurl 表示 贴吧 总链接
url为贴吧链接的社区:
关键是urlencode编码的贴吧中文名
使用 xpath_helper_2_0_2.crx 浏览器插件,帖子的链接条目可以归结为:
"//li/div[@class="t_con cleafix"]/div/div/div/a/@href",用户在帖子中张贴的图片链接表达式为:"//img··[@class = "BDE_Image"]/@src"
二、项目工具
Python 3.7.1,JetBrains PyCharm 2018.3.2
三、项目流程
(一)使用Xmind工具分析Python爬虫(网络爬虫)的流程图,绘制程序逻辑框架图如图4-1
图 4-1 程序逻辑框架图
(二)爬虫调试过程的Bug描述(截图)
(三)爬虫运行结果
(四)项目经历
本次实验的经验总结如下:
1、 当程序运行结果提示错误:ModuleNotFoundError: No module named 'lxml'时,最好的解决办法是先检查lxml是否安装,再检查lxml是否导入。在本次实验中,由于项目可以成功导入lxml,解决方案如图5-1所示。在“Project Interperter”中选择python安装目录。
图 5-1 错误解决流程
2、 有时候需要模拟浏览器,否则做过反爬的网站 会知道你是机器人
例如,对于浏览器的限制,我们可以设置 User-Agent 头。对于防盗链限制,我们可以设置Referer头。一些网站使用cookies进行限制,主要涉及登录和限流。没有通用的方法,只看能不能自动登录或者分析cookies的问题。
3、 第一步,我们可以从主界面的html代码中提取出这组图片的链接地址。显然,我们需要使用正则表达式来提取这些不同的地址。然后,有了每组图片的起始地址后,我们进入子页面,刷新网页,观察它的加载过程。
四、项目源码
贴吧pic.py
from urllib import request,parse
import ssl
import random
import time
from lxml import etree
ua_list=[
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'
]
def loadPage(url):
userAgent=random.choice(ua_list)
headers={"User-Agent":userAgent}
req =request.Request(url,headers=headers)
context=ssl._create_unverified_context()
response=request.urlopen(req,context=context)
html=response.read()
content=etree.HTML(html)
link_list=content.xpath('//li/div[@class="t_con cleafix"]/div/div/div/a/@href')
for link in link_list:
fullurl='http://tieba.baidu.com'+link
print(fullurl)
loadImge(fullurl)
def loadImge(url):
req = request.Request(url)
context = ssl._create_unverified_context()
response = request.urlopen(req, context=context)
html = response.read()
content = etree.HTML(html)
link_list = content.xpath('//img[@class="BDE_Image"]/@src')
for link in link_list:
print(link)
writeImge(link)
def writeImge(url):
req = request.Request(url)
context = ssl._create_unverified_context()
response = request.urlopen(req, context=context)
image = response.read()
filename=url[-12:]
f=open(filename,'wb')
f.write(image)
f.close()
def tiebaSpider(url,beginPage,endPage):
for page in range(beginPage,endPage+100):
pn=(page-1)*50
fullurl=url+"&pn="+str(pn)
loadPage(fullurl)
if __name__=="__main__":
print("测试成功!")
kw=input("请输入要爬的贴吧名:")
beginPage=int(input("请输入开始页:"))
endPage = int(input("请输入结束页:"))
url="http://tieba.baidu.com/f?"
key=parse.urlencode({"kw":kw})
fullurl=url+key
tiebaSpider(fullurl,beginPage,endPage)
转载于: