爬虫-百度贴吧相册
前些天写了两篇都没能过审,太难了,就连普通的小姐姐都过不了。哎,小姐姐怎么可以被认为是低俗。今天爬一点正经的 爬个百度贴吧相册吧。
现在多多少少爬了些网站, 一般都要求headers, 有一些爬到的图片打不开,要加Referer。有些要加authorization, 否则它不响应。有些要cookie的,反正就这么一回事。但我爬了百度贴吧才知道它有多骚,直接爬陈奕迅贴吧时,我是用requests模块来的,用xpath解析了大半天,一直返回空列表,之后又用BeautifulSoup试了试,还是空列表。最后发现返回页面的代码,被它注释了,真皮。去掉注释后,找到了具体每个相册的url, 到了相册内部的页面,我再尝试requests请求,却发现返回的代码独独少了具体每张图片的url相关数据,真花里胡哨。我他喵的直接用selenium爬,用selenium时没有设为开发者模式,又没有数据返回,只好又设置了selenium的开发者模式。最后才如尝所愿。源代码如下:
# 百度贴吧 陈奕迅图片
import requests
from lxml import etree
from fake_useragent import UserAgent
import os
from selenium import webdriver
urls = []
name = []
def get_urls(input):
ua = UserAgent()
headers = {'User-Agent': ua.random}
proxy = '' # 自己的代理地址
proxies = {
'http': 'http://' + proxy,
'https': 'https://' + proxy
}
url =f'https://tieba.baidu.com/f?kw={input}&ie=utf-8&tab=album'
response = requests.get(url, headers=headers, proxies=proxies).text
html = response.replace(r'<!--', ' ').replace(r'-->', ' ').replace('#', '"')
# 这个必须注释一下, 这里xpath 解析不出来主要是因为 服务器给我返回的源码 大部分都打了注释
# 百度真皮
global urls
global name
html_useful = etree.HTML(html)
urls = html_useful.xpath('//div[@id="good_right"]//div[@class="gr_block_main"]//div[@class="grbm_ele_wrapper"]//a[@class="grbm_ele_a grbm_ele_big"]/@href')
name = html_useful.xpath('//div[@id="good_right"]//div[@class="gr_block_main"]//div[@class="grbm_ele_wrapper"]//div[@class="grbm_ele_title"]//a/text()')
# print(response)
global path_fore
for j in range(len(name)):
path_fore = os.path.join('chenyixun', name[j])
print(urls)
print(name)
def image_urls(num, xiang_name):
url = f'https://tieba.baidu.com{num}#!/l/p1' # 相册地址
options = webdriver.ChromeOptions()
# options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2}) # 不加载图片加快访问速度
options.add_experimental_option('excludeSwitches', ['enable-automation']) # 设置为开发者模式,防止被网站识别出来是selenium
# options.add_argument('--headless') # 浏览器窗口不会弹出
browser = webdriver.Chrome(executable_path="C:/Users/86137/AppData/Local/Programs/Python/Python38/chromedriver.exe", options=options)
browser.get(url)
html = browser.page_source
browser.close()
html_useful = etree.HTML(html)
image_url = html_useful.xpath('//div[@class="ag_container"]//div[@class="ag_main"]//a[@class="ag_ele_a"]//img/@src')
ua = UserAgent()
headers = {'User-Agent': ua.random}
proxy = '' # 自己的代理地址
proxies = {
'http': 'http://' + proxy,
'https': 'https://' + proxy
}
for j in range(len(image_url)):
response_image = requests.get(image_url[j], headers=headers, proxies=proxies)
content = response_image.content
path_file = os.path.join('chenyixun', xiang_name + str(j) + '.jpg')
with open(path_file, 'wb')as f:
f.write(content)
if __name__ == "__main__":
if not os.path.exists('chenyixun'):
os.mkdir('chenyixun')
get_urls('陈奕迅')
i = 0
for num in urls:
xiang_name = name[i]
print(name[i] + ':正在下载')
image_urls(num, xiang_name)
i += 1
print(name[i]+':正在下载完成')
自己也试了试,fiddler抓包,要手机设置相关的代理Ip和安装相关证书,很难过的是B站和抖音视频现在,已经使用了SSL Pining 相关技术防止中间人攻击了,要想抓包就得root手机,并使用相应得应用来辅助抓包了,特别是抖音,连个网页版都没得。太复杂没有做后续。但我发现今日头条现在还是可以的,太不严谨了吧。
可惜了我爬的小姐姐没过审,就这些学业繁忙,告辞。