简单实例 爬取糗事百科段子
在命令行中浏览
首先,我们来看下糗事百科的首页:点击打开链接
再查看源码可以看到
我们想要的段子都是这样的:
<div class="content">
问:你买过最好的假货是什么?<br/>神回答:我曾经买过一本盗版书,竟然把正版书里的个别错别字给改了过来!
</div>
这说明只需要用 正则表达式 截取出来就行了
正则表达式:点击打开链接
再看网页的URL,该网页是分页的,所以可以直接枚举页数来访问
即:URL:http://www.qiushibaike.com/hot/page/页数
这样就可以用 Python 把网页下载下来了
但是没伪装头部 headers 还不行
所以要先查看当前网页的 User-Agent
这个在 F12 的 network 里可以看到
然后添加到 headers 里就行了
可见这篇文章:点击打开链接
当然,光访问还不够,还要显示,存储页面
这些在代码中可以看到
利用一个线程下载页面
主线程显示截取的段子
这样使得过程更加流畅,而不是每次显示又去等待下载截取网页
代码如下:
#coding: utf-8
#
#---- A simple spider-----
#---- Author: Idaplb -----
#-------------------------
#---- Enter is next page--
#---- q is quit ----------
import urllib.request
import re
import threading, time
class spider:
def __init__(self):
self.page = 1
self.pages = []
self.enable = False
def get_page(self, page):
url = "http://www.qiushibaike.com/hot/page/" + page + "/"
user_agent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"
headers = {"User-Agent": user_agent}
request = urllib.request.Request(url, headers = headers)
html_page = urllib.request.urlopen(request).read()
html_page = html_page.decode("utf-8")
re_item = re.findall("<div.*?class=\"content\">(.*?)</div>", html_page, re.S)
items = []
for item in re_item:
item = item.replace("\n", "")
item = item.replace("<br/>", "\n")
items.append(item)
return items
def load_page(self):
while self.enable:
if len(self.pages) < 2:
try:
page = self.get_page(str(self.page))
self.pages.append(page)
self.page += 1
except urllib.request.URLError as e:
if hasattr(e, "code"):
print(e.code)
elif hasattr(e, "reason"):
print(e.reason)
else:
time.sleep(1)
return
def show_page(self, now_page, page):
print("Show the %dth page" % (page))
for item in now_page:
print(item)
flag = input()
if flag == "q":
self.enable = False
break
return
def start(self):
self.enable = True
page = self.page
print("Loading...")
t = threading.Thread(target = self.load_page)
t.start()
while self.enable:
if self.pages:
now_page = self.pages[0]
del self.pages[0]
self.show_page(now_page, page)
page += 1
return
test_spider = spider()
test_spider.start()
其中按回车出一条段子,输入q 退出
整个过程走一遍并不复杂,只是很多地方要加以注意