程序爬的是指定区间页码内的本页内所有帖子的第一页的消息(懒得完善成一个帖子内全部了,主要的思路都是相同的)
先上代码
import urllib.request
import requests
import os
from lxml import etree
class Find_img():
def init(self):
# self.base_url = "https://tieba.baidu.com/f?"
self.base_url =‘http://tieba.baidu.com/f?&’
self.headers = {
“User-Agent”: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
“Chrome/75.0.3770.100 Safari/537.36”}
self.num =1
def get_param(self):
self.key =input("输入贴吧名称:")
self.page1 = input("输入起始页:")
self.page2 = input("输入终止页")
self.deal_First_Params()
def deal_First_Params(self):
page1 = int(self.page1) * 50 - 1
page2 = int(self.page2) * 50 - 1
for t in range(page1, page2 + 50, 50): #第一层循环控制页数
temp = t
temp = urllib.parse.urlencode({"pn": temp})
key = urllib.parse.urlencode({"kw": self.key})
url = self.base_url + key + '&' + temp
headers =self.headers
url = self.base_url + key
html =requests.get(url,headers).text
html =etree.HTML(html)
list_all =html.xpath('//div[@class="t_con cleafix"]/div/div/div/a/@href') #每个链接
base_url = 'http://tieba.baidu.com/'
for j in (range(len(list_all))): #第二层循环控制每页的帖子数
url =base_url + str(list_all[j])
self.deal_url(url)
def deal_url(self,url):
headers = self.headers
html = requests.get(url,headers).text
html = etree.HTML(html)
list = html.xpath('//img[@class="BDE_Image"]/@src')
for res_link in list: #第三层循环控制每个帖子内的图片数(只分析了首页)
print(res_link)
self.save_img(res_link)
def save_img(self,res_link):
headers =self.headers
# requests= urllib.request.Request(res_link, headers = headers)
# img = urllib.request.urlopen(requests).read()
files = os.getcwd() + "\图片" # 创建文件夹路径
res =requests.get(res_link,headers=headers)
res.encoding ="utf-8"
img = res.content #转换为二进制
if not os.path.exists(files): # 检查当前路径下此文件
os.mkdir(files) # 创建文件夹
filename ="pic"+str(self.num) #缩进坑爹
self.num+=1
with open(files + "\%s.jpg"%filename, "wb") as f:
f.write(img)
print(self.num)
Fun =Find_img()
Fun.get_param()
接下来上思路
按照惯例第一步是进入F12开发者模式然后分析源码(这次没有用正则表达式直接用了xpath去解析)根据地址栏的变化的规律来构造相应的url(具体的不知道可以看我前两篇)
首先是获取逐页获取源码,然后爬取本页内所有关于帖子的链接(不知道怎么定位代码可以看我第一篇关于爬虫的博客。)
(通过观察可以发现每一页的所有帖子都被一串数字区分开来,所以目的很明确,就是提取这一串数字然后作为进一步分析的url拼接的部分,来实现爬取本页内所有帖子的图片。
然后点进具体的帖子来进一步分析
定位到web的图片部分可以发现所有图片的链接都是放在属性为BDE_Image的img标签下面,我们可以通过xpath来解析获取图片的超链接。
最后要以二进制的方式将图片写入文件。