侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python爬取微信公众号文章

Python  /  管理员 发布于 7年前   194

本文实例为大家分享了python爬取微信公众号文章的具体代码,供大家参考,具体内容如下

# -*- coding: utf-8 -*-import requestsfrom bs4 import BeautifulSoupfrom requests.exceptions import RequestExceptionimport timeimport randomimport MySQLdbimport threadingimport socketimport math socket.setdefaulttimeout(60)#这里对整个socket层设置超时时间。后续文件中如果再使用到socket,不必再设置 glock = threading.Lock() #定义全局锁 CATEGORY_URL= ['http://www.we123.com/gzh/onclick/'] #获取地区分类链接all_url = [] #ALL_URLS = [] #所有详细页面链接proxy_list = [] #IP池URL = 'http://www.we123.com'PAGE_URL = [] #所有分页链接 #获取Ip池def get_ip():  headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}  url = 'http://http-webapi.zhimaruanjian.com'#可以使用芝麻代理,好用稳定还不贵  resp = requests.get(url,headers=headers)  obj = resp.json() #获取json ip池对象  for ip in obj:    arr = 'http://' + str(ip['ip']) + ':' + str(ip['port'])    proxy_list.append(arr) #获取页面源码函数def get_html(url):  # headers = {}  user_agent_list = [    'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3538.400 QQBrowser/9.6.12501.400',    'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0'  ]  # user_agent = random.choice(user_agent_list)  headers = {    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3538.400 QQBrowser/9.6.12501.400'  }  # 代理,免费的代理只能维持一会可能就没用了,自行更换  # proxy_list = [  #   "http://27.192.185.62:3252",  # ]  # proxy_ip = random.choice(proxy_list)  # proxies = {'http': proxy_ip}  # print(str(url))  try:    resp = requests.get(url,headers=headers)    # print("72行:status_code = " + str(resp.status_code))    # print(type(resp.text))    # print(resp.url) # 请求的url    if resp.status_code == 200:      return resp    elif resp.status_code == 404:      return resp    elif resp.status_code == 500:      return resp    return resp  except RuntimeError:    print("超时")    return "error"  except ConnectionError:    print("连接超时")    return "error"  except RequestException:    print("http请求父类错误")    with open('url_exception.txt','a+', encoding='utf-8') as f:      f.write(str(url))      f.write('\n')    return "error" #获取区域分类链接def get_categoty_url():  url = 'http://www.we123.com/gzh/onclick/'  resp = get_html(url)  soup = BeautifulSoup(resp.text,'lxml')  html = soup.select('div.div-subs2 > div.divst-content > div.divst-subs > li > a')  # 获取区域分类链接  for i in html:    city = i['href'].split("/")[-1]    if (city == '海外' or city == '台湾' or city == '澳门'):      continue    url = URL + i['href']    CATEGORY_URL.append(url)  print(CATEGORY_URL)  #获取每个区域下所有分页链接def get_page_url(url):  city = url.split('/')[-1]  html = get_html(url)  if html == "error":    print("98行:connect url error")    time.sleep(random.randint(10,20))    return "error"  soup = BeautifulSoup(html.text,'lxml')  #获取总条数  all_nums = soup.select("div.page > a > b")  if len(all_nums) == 0:    return "error"  else:    all_nums = soup.select("div.page > a > b")[0].get_text()  #获取总分页数  all_pages = math.ceil((int(all_nums) / 30))  #获取所有分页链接  all_page_url = []  for i in range(0,int(all_pages)):    page_url = 'http://www.we123.com/e/action/ListInfo.php?page=' + str(i) + '&classid=45&line=30&tempid=10&orderby=onclick&myorder=0&totalnum=' + str(all_nums)    all_page_url.append(page_url)  return all_page_url # 获取所有详细页面链接def get_page_urls():    global PAGE_URL    c_url = CATEGORY_URL.pop()    print('121 行:请求链接' + c_url)    PAGE_URL = get_page_url(c_url) #获取每个区域下面的所有分页链接 # 获取所有详细页面链接def get_info_urls():  while True:    global PAGE_URL #设置全局变量    glock.acquire() #加锁    if len(PAGE_URL) == 0:      glock.release() #解锁      print('131 行:CATEGORY_URL 为空')      break    else:      p_url = PAGE_URL.pop()      print('135 行:请求链接' + p_url)      glock.release() #解锁       glock.acquire() #加锁      html = get_html(p_url)      if html == "error":        print("141行:connect url error")        time.sleep(2)        return      soup = BeautifulSoup(html.text,'lxml')      info_urls = soup.select('div.gzhRight > div.gzh_list > ul > li > a')      for x in info_urls:        i_url = URL + x['href']        ALL_URLS.append(i_url)      print("库存链接共:" + str(len(ALL_URLS)))    glock.release() #解锁#获取每一页需要的数据def get_data():  while True:    global ALL_URLS #设置全局变量    glock.acquire() #加锁    print("当前库存:"+str(len(ALL_URLS)))    if len(ALL_URLS) == 0:      glock.release() #解锁      print('159 行 :ALL_URLS 为空')      break    else:      url = ALL_URLS.pop()      print("开始抓取数据:" + url)      glock.release() #解锁      time.sleep(1) #睡眠1秒钟      html = get_html(url)      if html == "error":        print("168行:connect url error")        time.sleep(random.randint(2, 4))        return      html.encoding='utf-8' #显式地指定网页编码,一般情况可以不用      soup = BeautifulSoup(html.text,'lxml')      #公众号名称      names = soup.select('div.artcleLeft > div.xcxnry > div.xcxtop > div.xcxtop_left > div.gzhtop_logo > h1')      #微信号id      accounts = []      accounts.append(soup.select('div.artcleLeft > div.xcxnry > div.xcxtop > div.xcxtop_left > div.gzhtop_logo > p')[0])      #微信头像      imgs = soup.select('div.artcleLeft > div.xcxnry > div.xcxtop > div.xcxtop_left > div.gzhtop_logo > img')      #公众号二维码      QR_codes= soup.select('div.artcleLeft > div.xcxnry > div.xcxtop > div.xcxtop_right > img')      #介绍      descs = soup.select('div.artcleLeft > div.xcxnry > div.xcxinfo')      #公众号分类      categorys = []      category = ''      cate = soup.select('div.artcleLeft > div.xcxnry > div.xcxtop > div.xcxtop_left > div.xcx_p > span > a')      if not len(cate) == 0:        category = cate[0].get_text()      else:        category = '综合'      glock.acquire() #加锁      for name,account,img,QR_code,desc in zip(names,accounts,imgs,QR_codes,descs):        data = {          'name':name.get_text(),          'category':category,          'account':account.get_text().split(":")[-1],          'img':img['src'],          'QR_code':QR_code['src'],          'desc':desc.get_text()        }        add_data(data,url)      glock.release() #解锁#添加数据def add_data(data,url):  con = MySQLdb.connect('127.0.0.1','root','root','test',charset="utf8",use_unicode=True)  cursor = con.cursor()  # exit()  insert_sql = """    insert ignore into weixin5(w_name,category,account,img,QR_code,introduce)    VALUES (%s,%s,%s,%s,%s,%s)    """  print('212行 :' + data['name'] + '_' + data['account'] + '添加成功!-' + url)  try:    cursor.execute(insert_sql,(data['name'],data['category'],data['account'],data['img'],data['QR_code'],str(data['desc'])))    con.commit()  except:    ALL_URLS.insert(0,url)    print("218行:" + URL + '插入失败')    con.rollback()  con.close() # 将时间字符串转化为时间戳def time_to(dt):  timeArray = time.strptime(dt, "%Y年%m月%d日")  timestamp = int(time.mktime(timeArray))  return timestamp #启动多线程爬取def main():  for x in range(3):    th = threading.Thread(target=get_info_urls)    th.start()     # get_info_urls()  time.sleep(3)  for x in range(5):    th = threading.Thread(target=get_data)    th.start() if __name__ == '__main__':  # 计时  t1 = time.time()  # 调用函数  get_ip() #获取ip池  get_page_urls()  time.sleep(2)  # get_categoty_url()  main()  print(time.time() - t1)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    python使用webdriver爬取微信公众号
    下一条:
    Python单向链表和双向链表原理与用法实例详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客