数据库连接所用到的pymysql驱动包请自行下载。
此爬虫爬取了贴吧帖子内容等。
# -*- coding: utf-8 -*- import requests import time from bs4 import BeautifulSoup import pymysql import os import sys #sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gbk') #改变标准输出的默认编码 #抓取网页的通用框架,获取页面的内容 def getHtml(url): try: r= requests.get(url,timeout=30) #状态码不是200就发出httpError的异常 r.raise_for_status() #获取正确的编码格式 # r.encoding=r.apparent_encoding r.encoding="utf-8" #打印内容 return r.text except: return "wrong!" #分析网页的html文件,整理信息,保存问列表文件中 def get_content(url): #初始化一个列表来保存所有的帖子信息 contents=[] #获取网页的内容 html=getHtml(url) #将网页内容格式化利用bs4库 soup = BeautifulSoup(html, 'lxml') #获取所有的li标签属性为 j_thread_list clearfix,用列表接收,获取子列表 liTags = soup.find_all('li', attrs={'class': ' j_thread_list clearfix'}) print(len(liTags)) #循环这个内容li集合 for li in liTags: #将爬取到了每一条信息。保存到字典里 content={} #将异样抛出,避免无数据时,停止运 try: #开始筛选信息 content['title']=li.find('a',attrs={"class":"j_th_tit"}).text.strip()#.strip() 翻译为中文 ##print (li.find('a',attrs={"class":"j_th_tit"}).text.strip()) #获取a标签的内部属性 content['link'] ="http://tieba.baidu.com/"+li.find('a', attrs={"class": "j_th_tit"})["href"] #print("http://tieba.baidu.com/"+li.find('a', attrs={"class": "j_th_tit"})["href"]) content['author']=li.find('span',attrs={"class":'tb_icon_author '}).text.strip() #print (li.find('span',attrs={"class":'tb_icon_author '}).text.strip()) content['responseNum']=li.find('span',attrs={'class': 'threadlist_rep_num center_text'}).text.strip() #print(li.find( # 'span', attrs={'class': 'threadlist_rep_num center_text'}).text.strip()) content['creatTime']=li.find('span',attrs={"class":'pull-right is_show_create_time'}).text.strip() #print (li.find( # 'span', attrs={'class': 'pull-right is_show_create_time'}).text.strip()) content['text']=li.find('div',attrs={"class":'threadlist_abs threadlist_abs_onlyline '}).text.strip() #print(li.find('div',attrs={"class":'threadlist_abs threadlist_abs_onlyline '}).text.strip()) #将字典加入到列表中 contents.append(content) except: print('获取内容出问题') #返回数据 return contents #写入数据库 def writedata(content): try: conn=pymysql.connect(host="localhost", port=3306, user="root", passwd="123456", db="test", charset='utf8') for c in content: sql="insert into crawler1 values(NULL,'"+c['title']+"','"+c['link']+"','"+c['author']+"','"+c['creatTime']+"','"+c['responseNum']+"','"+c['text']+"')" cursor =conn.cursor() cursor.execute(sql) conn.commit() except Exception as e: print("出问题") conn.rollback() raise e finally: conn.close() def writeTxt(content): #这里不能写成 f=open("data.txt",'a+')否则会乱码,设置成utf-8的格式,与getHtml(url):中的encoding一致 f=open("data.txt",'a+',encoding='utf-8') for c in content: f.write('标题: {} \t 链接:{} \t 发帖人:{} \t 发帖时间:{} \t 回复数量: {} \n'.format( c['title'], c['link'], c['author'], c['creatTime'], c['responseNum'])) #print(c['title']) url="http://tieba.baidu.com/f?kw=%D6%D0%B9%FA%CA%AF%D3%CD%B4%F3%D1%A7&fr=ala0&tpl=5" page=1 def main(url,page): url_list=[] #将所需要爬取的url放到列表中 for i in range(0,page): url_list.append(url+'&pn='+str(i*50)) for u in url_list: content=get_content(u) writeTxt(content) writedata(content) if __name__=="__main__": main(url,page) #get_content("http://tieba.baidu.com/f?kw=%D6%D0%B9%FA%CA%AF%D3%CD%B4%F3%D1%A7&fr=ala0&tpl=5")