网页爬虫抓取百度图片(项目工具Python3.7.1、JetBrainsPyCharm三、项目过程(四) )

优采云 发布时间: 2022-01-21 06:18

  网页爬虫抓取百度图片(项目工具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)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线