wzdyjn 发表于 2020-7-16 19:29:55

百度贴吧抓取问题

【求助帖】请及时确认最佳答案,下次提问时可以得到更多关注,问题可以更快解决
我前几天还可以爬百度贴吧,,今天不行了,,,,
url =https://tieba.baidu.com/f?kw=%E6%9D%8E%E6%AF%85&mo_device=1&pn=0&      那位大神看下 谢谢了
加上cookie都抓不到数据

zltzlt 发表于 2020-7-16 19:30:56

发代码……

wzdyjn 发表于 2020-7-16 19:33:34

import requests
from lxml import etree



class TiebaSpider:
    def __init__(self,tieba_name):
      self.start_url='https://tieba.baidu.com/f?kw='+tieba_name+'&mo_device=1&pn=30&'
      self.headers={
            'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36',
            'Cookie':'BAIDUID=3910AAC3648F83F7C91FF62BFEEA3A5B:FG=1; PSTM=1594791849; BIDUPSID=A2C9C50B4451698E8184A5127F79101E; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; TIEBA_USERTYPE=6a1d9b62b655485ece22e331; TIEBAUID=cb23caae14130a0d384a57f1; Hm_lvt_98b9d8c2fd6608d564bf2ac2ae642948=1594843199; st_key_id=17; wise_device=0; mo_originid=2; IS_NEW_USER=c6ccba2c6228269eac804531; BAIDU_WISE_UID=wapp_1594843363615_668; USER_JUMP=-1; CLIENTHEIGHT=854; CLIENTWIDTH=505; SEENKW=%E6%9D%8E%E6%AF%85%23%C0%EE%D2%E3; LASW=438; tb_as_data=4456f8ecf42b3af3a51ef6ea935a01f27d2a7a870cccced869901a220fce8c7c96cadfab4b8a09ab92f3b8b2ee59517fc9171f24849c9ac8c876069a8f0fce82e8316b8b7aa12a7d91f45f4bdabb157527bdbea2a9a9c34951b455c83aabb44dc5eb764996c71d96871c92136257eca5; Hm_lpvt_98b9d8c2fd6608d564bf2ac2ae642948=1594843579; st_data=d1c224669d51a4f51e54c234cfd7fe5dc27d3abd9093bfde2c26d005e01a4983a767a2283682899a336c9984c0ef2a7040e18c05fe4e46f1af81e114fe504bcdd9dbc90a669bca7e765bffc8bb9e82758f3fd788ae2fe18bac7df53c4ccc45ac375988682f4e7ecbc4780269fe01be9b745511ca7bcce149c6fc7ea4c104624a; st_sign=814136cd'
      }

    def parse_url(self,url):
      response=requests.get(url,headers=self.headers,verify=False)
      rel=response.content.decode()
      with open('baidutieba.html','w',encoding='utf-8') as f:
            f.write(rel)
            print('ok')
      return rel

    def get_content_list(self,html_str):
      html=etree.HTML(html_str)


    def run(self):
      #1 start_url
      #2 发送请求 获取响应
      html_str=self.parse_url(self.start_url)
      #3 提取数据 提取下一页的URL地址
         #3.1提取列表中的url地址和标题
         #3.2请求别表中的url地址 获取详情页的第一页
         #3.3提取详情页第一页的图片,提取下一页的url地址
         #3.4请求下一页 进入循环 3.2---3.4

      # 保存数据
      # 请求下一页的url地址 进入循环2-5步


if __name__ == "__main__":
    baidu=TiebaSpider('李毅')
    baidu.run()

wzdyjn 发表于 2020-7-16 19:34:19

只写了个框,,,写到这调试都没过去取不到要的数据

Twilight6 发表于 2020-7-16 21:25:14

贴吧这段时间反爬更强了好像,我之前的代码也无效了

suchocolate 发表于 2020-7-17 00:18:32

本帖最后由 suchocolate 于 2020-7-17 00:31 编辑

用爬美女吧图片的代码可以爬李毅吧的图
import requests
from lxml import etree
import os


# 主函数
def main(num):
    # 检查目录
    ckdir()
    # 图片计数
    n = 1
    # 逐页下载
    for x in range(num):
      # 第一页的url和其他页不同
      if x == 0:
            url = url1
      else:
            url = url2 + str(x * 50)
      imgs = get_url(url)
      print('开始下载第' + str(x + 1) + '页')
      n = dl_img(imgs, n)
    print('下载完成,共下载' + str(n) + '张')


# 创建存储图片的目录,可根据喜好更改名称
def ckdir():
    if not os.path.isdir('pics'):
      os.mkdir("pics")


# 分析页面图片的url
def get_url(url):
    # 登陆论坛页面
    r = requests.get(url, headers=headers)
    html = etree.HTML(r.text)
    # 过滤出贴子url
    result1 = html.xpath('//div/a/@href')
    img_urls = []
    # 进入各个贴子
    for sfx in result1:
      r = requests.get(base_url + sfx, headers=headers)
      print('获取页面' + sfx + '的图片地址...')
      html = etree.HTML(r.text)
      # 查找贴子内的图片链接
      result2 = html.xpath('//img[@class="BDE_Image"]/@src')
      # 如果有图片连接,放入到图片链接列表
      if result2:
            img_urls.extend(result2)
    return img_urls


# 下载图片
def dl_img(img_urls, n):
    num = str(len(img_urls))
    print('有' + num + '张照片要下载。')
    # 遍历图片链接列表
    for img in img_urls:
      r = requests.get(img, headers=headers)
      pic_name = img.split('/')[-1]
      with open('pics\\' + pic_name, 'wb') as f:
            f.write(r.content)
      print('已下载' + pic_name + ',共下载' + str(n) + '张。')
      n = n + 1
    return n


if __name__ == '__main__':
    # 设置基础参数
    headers = {'user-agent': 'firefox'}
    # url1是李毅吧的网址,可根据需要自行更换其他贴吧,复制浏览器地址,粘贴到这里即可
    url1 = 'https://tieba.baidu.com/f?ie=utf-8&kw=%E6%9D%8E%E6%AF%85&fp=0'
    # url2是李毅吧非第一页的网址,后面的字稍有变化,大家自行更换
    url2 = 'https://tieba.baidu.com/f?ie=utf-8&kw=%E6%9D%8E%E6%AF%85&pn='
    base_url = 'https://tieba.baidu.com'
    page_num = input('请问你想下载几页的贴子的图片:')
    page_num = int(page_num)
    main(page_num)

wzdyjn 发表于 2020-7-17 19:02:14

这个代码依然不行,,看来贴吧反爬做的越来越好了

suchocolate 发表于 2020-7-19 17:13:19

wzdyjn 发表于 2020-7-17 19:02
这个代码依然不行,,看来贴吧反爬做的越来越好了

这个是你的python对ssl的警告,verify关掉,35行:
r = requests.get(url, headers=headers, verify=False)我这里用这个代码可以下载出图片:


页: [1]
查看完整版本: 百度贴吧抓取问题