..
每天进步一点点
历经劫难,终于搞定了。自动抓取网页信息并保存到数据库中。
硬核
需要的模块
import urllib.request
import re
import urllib.error
import MySQLdb
模拟浏览器
有些网站有反爬机制,必须要模拟成电脑浏览器才行,必要时候还需要代理。
headers = ('User-Agent','Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36')
opener = urllib.request.build_opener()
opener.addheaders = [headers]
urllib.request.install_opener(opener)
数据入库
这里入坑比较多,主要是数据类型的处理,sql
变量部分,他是字符串,是给模块处理的,cur.execute(sql, (a, b, c))
部分。python源码:def execute(self, query, args=None):
query为传入指令,而args传入的为list或tuple数据类型。
def push_db(a, b, c): #a b c 指代author、content和id
db = MySQLdb.connect(
host = '127.0.0.1',
port = 3306,
user = '****', #数据库用户名
password = '******', #数据库密码
db = 'qiushibaike',
charset = 'utf8'
)
cur = db.cursor()
sql = "insert into main (author, content, id) values (%s, %s, %s)"
try:
cur.execute(sql, (a, b, c))
cur.close()
db.commit()
except:
db.rollback()
db.close()
抓取分析网页:
def crawl(url, page_num):
for i in range(0, page_num):
real_url = url + str(i+1)
try:
data = urllib.request.urlopen(real_url).read().decode('utf-8', 'ignore')
pat_1 = "<h2>(.*?)</h2>" #author
pat_2 = '<div class="content">.*?<span>(.*?)</span>.*?</div>' #content
author = re.compile(pat_1, re.S).findall(data)
content = re.compile(pat_2, re.S).findall(data)
for j in range(0, len(author)):
author[j] = author[j].replace('\n', '')
content[j] = content[j].replace('<br/>', '\n')
print("-------"+str(j+1)+"------>")
push_db(author[j], content[j],str(i+1)+"-"+str(j+1))
except urllib.error.URLError as error:
if(hasattr(error, 'code')):
print(error.code)
if(hasattr(error, 'reason')):
print(error, reason)
调取
url = "https://www.qiushibaike.com/text/page/"
page_num = input("请输入你要抓取的页面条数:")
crawl(url, int(page_num))
后续
可以安装MySQL可视化软件例如:navicat,将库中的数据以Excel导出,然后分析数据。