最近需要收集語料,因此學習了一些爬蟲的知識,參考網上對糗事百科的爬蟲,編寫了如下**
#!usr/bin/env python
# -*- coding: utf-8 -*-
import re
from urllib import request
for page in range(1, 2):
print(page)
url = '' + str(page)
user_agent = 'mozilla/4.0 (compatible; msie 5.5; windows nt)'
headers =
try:
req = request.request(url, headers=headers)
with request.urlopen(req, timeout=5) as response:
content = response.read().decode('utf-8')
print(content)
pattern = re.compile(
'.*?(.*?).*?.*?(.*?)'\
'.*?(.*?)',
re.s)
items = re.findall(pattern, content)
for item in items:
if not re.search("thumb", item[3]):
print(item[0].replace("'", ""), item[1].strip(), item[2].strip(), item[4], item[5])
except request.urlerror as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
對下面正規表示式的解釋(引用
pattern = re.compile(
'.*?(.*?).*?.*?(.*?)'\
'.*?(.*?)',
re.s)
1).*? 是乙個固定的搭配,.和*代表可以匹配任意無限多個字元,加上?表示使用非貪婪模式進行匹配,也就是我們會盡可能短地做匹配,以後我們還會大量用到 .*? 的搭配。
2)(.*?)代表乙個分組,在這個正規表示式中我們匹配了五個分組,在後面的遍歷item中,item[0]就代表第乙個(.*?)所指代的內容,item[1]就代表第二個(.*?)所指代的內容,以此類推。
3)re.s 標誌代表在匹配時為點任意匹配模式,點 . 也可以代表換行符。
以上**在執行的過程中可能會存在問題(爬著爬著,就跑不動了),查詢了一些資料後,給的原因是對於太過複雜的正規表示式,匹配時會出現這樣的情況。
鑑於以上這種原因,我們採用beautifulsoup可以解決,beautifulsoup是根據html的格式來解析的。具體**如下
#!usr/bin/env python
# -*- coding: utf-8 -*-
import re
from urllib import request
from bs4 import beautifulsoup
def find_all(item, attr, c):
return item.find_all(attr, attrs=, limit=1)
for page in range(1, 20):
print(page)
url = '' + str(page)
user_agent = 'mozilla/4.0 (compatible; msie 5.5; windows nt)'
headers =
try:
req = request.request(url, headers=headers)
with request.urlopen(req, timeout=5) as response:
content = response.read().decode('utf-8')
soup = beautifulsoup(content, 'html.parser')
all_div = soup.find_all('div', attrs=)
for i, e_div in enumerate(all_div):
result = {}
result['id'] = e_div.attrs['id']
result['name'] = e_div.h2.string.strip()
cont = e_div.find_all('div', attrs=)
result['content'] = cont[0].text.strip()
silme_comment = e_div.find_all('i', attrs=)
result['silme_num'] = int(silme_comment[0].text.strip())
result['comment_num'] = int(silme_comment[1].text.strip())
print(result)
except request.urlerror as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
python 爬取糗事百科
step 1 構建乙個提取糗事百科笑話的函式import urllib2 import urllib import re import thread import time import sys reload sys sys.setdefaultencoding utf 8 defgetpage p...
Python爬取糗事百科
一 引入模組 因為urlopen功能比較簡單,所以設定 ip需引入proxyhandler和build opener模組,ip的獲取可以上西祠 查詢 import re from urllib.request import request,build opener,proxyhandler base...
Python 爬取糗事百科
coding utf 8 import urllib2 import urllib import re class qiushi def init self self.page 1 從網頁獲取糗事 def getqiushis self,page url page 偽裝瀏覽器 user agent ...