Python爬取糗事百科段子
Python2.7.15
今天我们来爬取糗事百科的段子
一、获取糗事百科的网页源码
首先,打开浏览器,进入糗事百科,复制它的网址。
然后我们翻个页,可以看到,网址变成了这样,加上了页码。
待会我们用代码翻页,就是更改这个网址最后的这个数字。
首先,我们引入代码对应的模块
# coding=utf-8
import urllib2
import re
import MySQLdb
utf-8是中文编码
urllib2模块的方法获取网页
re模块用来写正则表达式
MySQLdb是MySQL数据库对应的模块
老办法获取网页源码
不过这次加了一个for循环来翻页
for page in range(1,14):
url = "https://www.qiushibaike.com/8hr/page/" + str(page) + "/"
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
request = urllib2.Request(url, headers=headers)
response = urllib2.urlopen(request)
content = response.read()
二、匹配正则
得到网页源码后,我们可以在源码里看到很多段子和很多的发布人,这里面有的段子是文字形式的,有的是图片,因为图片文字混在一起存比较麻烦所以我们先来简单的,只爬取并保存文字形式的段子。
先看源码
h2标签里是发布者的名称
span标签里是文字内容
a标签里是图片,如果该段子有图片的话
这三项是连在一起的,使用正则抓取它们
这里的re.S是多行匹配的意思
三、输出它们,并写入数据库
输出操作
for item in items:
haveImg = re.search("jpg", item[2])
if not haveImg:
new1 = re.sub('\n','', item[0])
new2 = re.sub('\n','', item[1])
new3 = new2.translate(None, "<br/>")
print new1
print new3
创建表(首先你得有数据库,并有你要写入的这个表)
conn=MySQLdb.connect(host="127.0.0.1",user="root",passwd="199855pz",db="pz",charset='utf8')
print '连接成功'
cursor = conn.cursor()
cursor.execute("DROP TABLE IF EXISTS DUANZI")
sql = '''CREATE TABLE DUANZI(name char(10) ,joke char(255))'''
cursor.execute(sql)
插入表
insert_duanzi = ("INSERT INTO DUANZI(name,joke)" "VALUES(%s,%s)")
data_duanzi = (new1, new3)
cursor.execute(insert_duanzi, data_duanzi)
conn.commit()
四、完整代码与结果
# coding=utf-8
import urllib2
import re
import MySQLdb
conn=MySQLdb.connect(host="127.0.0.1",user="root",passwd="199855pz",db="pz",charset='utf8')
print '连接成功'
cursor = conn.cursor()
cursor.execute("DROP TABLE IF EXISTS DUANZI")
sql = '''CREATE TABLE DUANZI(name char(10) ,joke char(255))'''
cursor.execute(sql)
for page in range(1,14):
url = "https://www.qiushibaike.com/8hr/page/" + str(page) + "/"
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
request = urllib2.Request(url, headers=headers)
response = urllib2.urlopen(request)
content = response.read()
print content
pattern = re.compile('<h2>(.*?)</h2>.*?<span>(.*?)</span>.*?</a>(.*?)<div class="stats">', re.S)
items = re.findall(pattern, content)
for item in items:
haveImg = re.search("jpg", item[2])
if not haveImg:
new1 = re.sub('\n','', item[0])
new2 = re.sub('\n','', item[1])
new3 = new2.translate(None, "<br/>")
print new1
print new3
insert_duanzi = ("INSERT INTO DUANZI(name,joke)" "VALUES(%s,%s)")
data_duanzi = (new1, new3)
cursor.execute(insert_duanzi, data_duanzi)
conn.commit()