Python作为一个高级编程语言,不知从何时起就在圈子里流行起来了。个人也是图个鲜,跟上时代步伐学习了一下。“鲁迅”说过:不能学以致用,就是耍流氓。我用python对虎扑论坛作了一个爬虫。脚本写的糙了点,权作初学者交流使用,同时也方便以后查阅。本来是准备写一个虎扑的分析帖子,可后来动力不足就没有写成了。不过,作为一个马刺球迷很荣幸我们的组织是热度前三。

  准备工作:安装Python、安装MySQL、虚拟机【选择性,后期将每日放在服务器上执行定时任务使用】

    1、安装python:选择3.*,过程忽略

    2、安装MySQL:选择5.6版本及以上,过程忽略

    3、虚拟机:linux系列,过程忽略

  需求描述

    爬取虎扑论坛帖子,了解帖子内容、作者、热度等。

  写脚本

    一共分为三部分:part1通过对当前链接进行分析,提取帖子作者、阅读的信息;part2取得帖子本身的内容;part3对发帖人进行数据提取,为后期分析提供思路。具体的脚本如下。需要注意的是:编码、编码、编码。谢谢!

    注:由于虎扑的反爬虫导致可细分论坛的可读取页面数为10(突破防御失败,谢谢!)这种情况下,我的处理方式是将脚本放入服务器中每日爬取进行累积。

    Part1:爬取帖子的名称、作者、创建时间、阅读/回复、作者链接等,并放入本地MySQL数据库

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import requests
import json
import time
import pymysql
import importlib,sys
importlib.reload(sys)forum_note_sum=[]  #variavle:save the content of tiezi
list_d=['原创','翻译','讨论']  #内容判断条件,如果帖子标题内容为此,取另一个值
type = sys.getfilesystemencoding()
#num:the record number of one page;get tiezi of author and others
def parent_li_web(num):forum_note_record = {}try:parent_tiezi=bs_obj.find('ul',class_='for-list').find_all('li')[num]div_one = parent_tiezi.find('div', class_='titlelink box')div_two = parent_tiezi.find('div', class_='author box')span_three = parent_tiezi.find('span', class_='ansour box').string.strip()div_four = parent_tiezi.find('div', class_='endreply box')subname=div_one.a.stringsublink='https://bbs.hupu.com'+div_one.a['href']team_tmp=theme_tmpfor i in list_d:if i==subname:subname=div_one.find_all('a')[1].stringsublink='https://bbs.hupu.com'+div_one.find_all('a')[1]['href']# print (i,subname,sublink)forum_note_record.update({'subname':subname,'subname_link':sublink,'author':div_two.a.string,'author_link':div_two.a['href'],'author_create_time':div_two.find('a',style='color:#808080;cursor: initial; ').string,'read_reply_number':span_three,'last_reply_writer':div_four.span.string,'last_reply_time':div_four.a.string,'team_tmp':team_tmp})forum_note_sum.append(forum_note_record)except:return Noneif __name__=='__main__':# all_spurs_notebegin_time=time.time()print('---------脚本执行时间为:{}------------'.format(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())))team_list = ['rockets', 'warriors', 'cavaliers', 'spurs', 'lakers', 'celtics', 'thunder', 'clippers','timberwolves', 'mavericks', 'knicks', 'bulls', 'nets', 'sixers', 'jazz', 'pacers', 'blazers', 'heat','suns', 'grizzlies', 'wizards', 'pelicans', 'bucks', 'kings', 'raptors', 'nuggets', 'hawks', 'hornets','pistons', 'magic']for li in team_list:forum_note_sum_code=[]theme_tmp=lifor i in range(1,11,1):   #由于虎扑反爬,只能爬到10页;后续可放入linux中定时执行url = 'https://bbs.hupu.com/{}-{}'.format(li,i)print (url)wb_string = requests.get(url)bs_obj = BeautifulSoup(wb_string.content, 'html.parser')with open('web_spider_original.txt','w',encoding='utf8') as f:f.write(str(bs_obj))f.write('\r'*10+'-----我是分割线-----'+'\r'*10)for j in range(1,61,1):   #每个页面数据有60个帖子parent_li_web(j)with open('hupu_spider_spurs_load.txt', 'w', encoding='utf8') as f:for item in forum_note_sum:json.dump(item,f,ensure_ascii=False)f.write('\r')#insert into mysqlconn=pymysql.connect(host='localhost',user='root',passwd='1234',db='spider',port=3306,charset='utf8')cur=conn.cursor()cur.execute('delete from hupuforum_spurs_note_daytmp')with open('hupu_spider_spurs_load.txt','r',encoding='utf8') as f:for item in f:item=json.loads(item) #how convert string to dict# print(type(item))cur.execute('insert into hupuforum_spurs_note_daytmp(subname,subname_link,author,author_link,author_create_time,read_reply_number,last_reply_writer,last_reply_time,theme_title) values(%s,%s,%s,%s,%s,%s,%s,%s,%s)',(item['subname'],item['subname_link'],item['author'],item['author_link'],item['author_create_time'],item['read_reply_number'],item['last_reply_writer'],item['last_reply_time'],item['team_tmp']))conn.commit()cur.close()conn.close()print('Finished!本次执行消耗时间为:{}秒'.format(time.time()-begin_time))

  Part2:增加贴子内容并更新部分字段

# coding=utf8
import time
import requests
from bs4 import BeautifulSoup
import pymysql
import signalbegin_time=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
conn=pymysql.connect(host='localhost',port=3306,user='root',passwd='1234',db='spider',charset='utf8')
cur=conn.cursor()
sub_cur = conn.cursor()
cur.execute('INSERT INTO hupuforum_spurs_note SELECT * FROM hupuforum_spurs_note_daytmp WHERE subname_link NOT IN (SELECT a.subname_link FROM hupuforum_spurs_note a);')
cur.execute('update hupuforum_spurs_note a,hupuforum_spurs_note_daytmp b set a.read_reply_number=b.read_reply_number,a.last_reply_writer=b.last_reply_writer,a.last_reply_time=b.last_reply_time where a.subname_link=b.subname_link ')
# conn.commit()
cur.execute('use spider;')
conn.commit()
cur.execute('select subname_link from hupuforum_spurs_note where sub_text is null;')
for url in cur.fetchall():url=list(url)# print(url)try:wb_page = requests.get(url[0],timeout=2)   #实际执行中,存在网页假死状态,设置超时bs_obj = BeautifulSoup(wb_page.content, 'html.parser')tmp_text = bs_obj.select('#tpc > div > div.floor_box > table.case > tbody > tr > td > div.quote-content')sub_text=tmp_text[0].get_text(strip=True)sub_text=sub_text.replace('\'','’')sql="""update hupuforum_spurs_note set sub_text=\'{}\' where subname_link={};""".format((sub_text[:1000]),str(url).replace('[','').replace(']',''))# print(sql)
        sub_cur.execute(sql)conn.commit()print('success')except IndexError as e:   #这个错误意味着页面也不存在sql="""update hupuforum_spurs_note set sub_text=\'{}\' where subname_link={};""".format('网页不存在',str(url).replace('[','').replace(']',''))sub_cur.execute(sql)conn.commit()except pymysql.err.InternalError as e:  #说明内容中包含emoj等utf8四字符内容sql="""update hupuforum_spurs_note set sub_text=\'{}\' where subname_link={};""".format('内容格式有误,导致出错!',str(url).replace('[','').replace(']',''))sub_cur.execute(sql)conn.commit()except requests.exceptions.ReadTimeout as e: #网页响应超时sql="""update hupuforum_spurs_note set sub_text=\'{}\' where subname_link={};""".format('网页打开超时',str(url).replace('[','').replace(']',''))sub_cur.execute(sql)conn.commit()else:sql="""update hupuforum_spurs_note set sub_text=\'{}\' where subname_link={};""".format('其他类型错误',str(url).replace('[','').replace(']',''))sub_cur.execute(sql)conn.commit()
conn.commit()
cur.close()
sub_cur.close()
conn.close()
end_time=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
print('Finished,任务开始时间为:{},结束时间为:{}'.format(begin_time,end_time))

  Part3:爬取注册用户信息

# coding=utf8
import time
import requests
from bs4 import BeautifulSoup
import pymysqlbegin_time=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
conn=pymysql.connect(host='localhost',port=3306,user='root',passwd='1234',db='spider',charset='utf8')
cur=conn.cursor()
sub_cur=conn.cursor()
cur.execute('select distinct author_link from hupuforum_spurs_note;')
for author_url in cur.fetchall():try:author_url=list(author_url)wb_obj=requests.get(author_url[0],timeout=2)bs_obj=BeautifulSoup(wb_obj.content,'html.parser')author=bs_obj.select('#main > div.personal > div.personal_right > h3 > div')[0].stringauthor_visited=bs_obj.select('#main > div.personal > div.personal_right > h3 > span')[0].string.replace('有','').replace('人次访问','')author_info=bs_obj.select('#main > div.personal > div.personal_right > div')[0].get_text(strip=True)sub_cur.execute('insert into hupuforum_authors_info(author,author_link,author_visited,author_info,author_status) values(%s,%s,%s,%s,%s)',(author,author_url[0],author_visited,author_info,'正常'))except IndexError as e:sub_cur.execute('insert into hupuforum_authors_info(author,author_link,author_visited,author_info,author_status) values(%s,%s,%s,%s,%s)',(author, author_url[0], '', '', '无法访问'))conn.commit()
conn.commit()
cur.close()
conn.close()
end_time=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
print('Finished,任务开始时间为:{},结束时间为:{}'.format(begin_time,end_time))

转载于:https://www.cnblogs.com/SunHuaJ/p/7976819.html

python-虎扑爬虫相关推荐

  1. 史上最全虎扑爬虫,带你看网络爬虫下的步行街

    前言 本项目由 https://blog.csdn.net/sinat_22767969/article/details/82953774 而来,之前爬过各大高校的百度贴吧,本人也是位小jr,想着玩玩 ...

  2. python虎扑社区论坛数据爬虫分析报告

    以下是摘自虎扑的官方介绍: 虎扑是为年轻男性服务的专业网站,涵盖篮球.足球.F1.NFL等赛事的原创新闻专栏视频报道,拥有大型的生活/影视/电竞/汽车/数码网上交流社区,聊体育谈兴趣尽在虎扑. 二.数 ...

  3. python爬取论坛图片_[python爬虫] Selenium定向爬取虎扑篮球海量精美图片

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员 ...

  4. python爬取虎扑评论_python爬虫系列Selenium定向爬取虎扑篮球图片详解

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员 ...

  5. 【Python爬虫】MongoDB爬虫实践:爬取虎扑论坛

    MongoDB爬虫实践:爬取虎扑论坛 网站地址为:https://bbs.hupu.com/bxj 1.网站分析 首先,定位网页上帖子名称.帖子链接.作者.作者链接.创建时间.回复数目.浏览数目.最后 ...

  6. [python 爬虫]Python爬虫抓取虎扑论坛帖子图片

    自从可以实现抓取文字了,自然要尝试更多的类型,比如图片.我是一个有逛虎扑论坛习惯的人,经常会发现有些帖子的图片挺好看的想保存下来,但是如果人为保存的话,一个帖子至少都有二三十张,这将是一个庞大的工作量 ...

  7. python爬虫(爬虎扑英雄联盟论坛)

    第十五讲 BeautifulSoup解析HTML标签 爬虫实战项目(英雄联盟虎扑论坛) import requests url = 'https://bbs.hupu.com/lol' headers ...

  8. python爬虫爬取虎扑湖人论坛专区帖子数据,并存入MongoDB数据库中

    今天就带大家从头到尾一步一步带着大家爬取虎扑论坛帖子的数据,里面涉及到的一些知识,我会给出学习的连接,大家可以自行去学习查看. 前期准备 首先我们打开虎扑NBA论坛,我选择的是湖人专区(小湖迷一个). ...

  9. 【Python爬虫系列教程 11-100】Python网络爬虫实战:最简单的Pandas 中的read_html一行代码爬取网页表格型数据,就可以爬取虎扑体育NBA球员信息

    文章目录 爬取对象 分析 实现代码 爬取对象 虎扑是一个认真而有趣的社区,每天有众多JRs在虎扑分享自己对篮球.足球.游戏电竞.运动装备.影视.汽车.数码.情感等一切人和事的见解,热闹.真实.有温度. ...

  10. 爬取虎扑NBA首页主干道推荐贴的一只小爬虫,日常爬不冷笑话解闷

    虎扑是广大jrs的家园,步行街是这个家园里最繁华的地段.据称广大jrs平均学历985,步行街街薪30w起步. 大学时经舍友安利,开始了解虎扑,主要是看看NBA的一些资讯. 偶尔也上上这个破街,看看jr ...

最新文章

  1. java中String xx xx_Java 9 紧凑String改进[JEP 254]Java9新特性
  2. Asp.Net 中使用客户端Activex控件需要注意的事情
  3. VMware View 5.2 安装实施七 安装Web Client
  4. 北京交通大学2018计算机硕士录取公示,2017年北京交通大学研究生录取名单!!!...
  5. 【模型调优】风控模型调优相关知识
  6. 2020-11-24(Windows保护模式学习笔记(1)—— 段寄存器与段权限检查)
  7. C++文件头,命名空间,new和delete,内联函数,引用,函数重载,构造函数和析构函数,深拷贝和浅拷贝,explict,this指针
  8. 【ArcGIS风暴】ArcGIS求一个矢量图层中多个图斑的“四至点”坐标案例教程
  9. bash中时间、日期操作
  10. 据悉,深圳某工程师沦为C语言笔试枪手
  11. Minikube-运行在笔记本上的Kubernetes集群
  12. (Command Pattern)命令模式
  13. python 笔记 之 练习答案-ABCD乘以9=DCBA
  14. 微软正式发布 Silverlight 5
  15. 网络工程师(软考)学习笔记3--计算机网络体系结构2
  16. 计算机论文如何加字数,发表论文的字数是如何计算的?
  17. ImageJ自动测量每个细胞平均荧光强度及批量处理多张图片
  18. antd picker 使用 如何_antd-RangePicker
  19. 软件项目的规模、工作量和成本是如何进行估算的
  20. Chapter 5 (Eigenvalues and Eigenvectors): The characteristic equation (特征方程)

热门文章

  1. 科大讯飞与优刻得、寒武纪等联合设立合肥智能语音创新发展有限公司
  2. SAP MIGO 报错-在例程WERT_SIMULIEREN字段NEUER_PREIS中字段溢出-
  3. 重磅丨AI公共政策成全球热点,美国ITI发布《人工智能政策原则》
  4. dgl库之高级用法dgl.DGLGraph.update_all
  5. codeblocks的错误提示框不见了
  6. 深度学习不可信?大脑建模先驱有话说
  7. 麦肯锡季刊 | 人工智能的发展与障碍
  8. Python 什么时候会被取代?
  9. 【机器视觉】探索机器学习理论的最新进展,走近云、端、芯上的视觉计算
  10. 谷歌机器人业务重组 花里胡哨没有用 要做实干家