【環(huán)境配置】出現(xiàn):Microsoft Visual C++ 14.0 is required 的解決方案
如:pip install scrapy 時(shí)出現(xiàn):

error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools”: http://landinghub.visualstudio.com/visual-cpp-build-tools
說(shuō)明計(jì)算機(jī)中缺少M(fèi)icrosoft Visual C++ 14.0
但錯(cuò)誤信息中提供的網(wǎng)址是無(wú)效的,需要自行從網(wǎng)絡(luò)中下載安裝MV C++14.0
可以使用以下鏈接進(jìn)行下載安裝:
鏈接:https://pan.baidu.com/s/1G7DomtDZG0GpgSVZXloscw
提取碼:ik9k
技術(shù)選型:
- request和beautifulsoup都是庫(kù),scrapy是框架
- scrapy框架中可以加入request和beautifulsoup的庫(kù)
- scrapy基于twisted,性能是最大的優(yōu)勢(shì)
- scrapy方便擴(kuò)展,提供了很多內(nèi)置的功能
- scrapy內(nèi)置的CSS和xpathselector方便,beautifulsoup的缺點(diǎn)是慢
網(wǎng)頁(yè)分類:
- 靜態(tài)頁(yè)面
- 動(dòng)態(tài)頁(yè)面
- webservices(restapi)
爬蟲(chóng)能做什么:
- 搜索引擎
- 推薦引擎
- 機(jī)器學(xué)習(xí)的數(shù)據(jù)樣本
- 數(shù)據(jù)分析、輿情分析
正則表達(dá)式:
出現(xiàn)問(wèn)題:pycharm授權(quán)賬戶過(guò)期
建議更新賬戶后下載離線激活碼使用
下載離線激活碼
- 新建python工程
- 新建的python工程使用虛擬環(huán)境,在創(chuàng)建時(shí)會(huì)自動(dòng)下載安裝setuptools,pip,wheel等
-
在工程下新建名為“test”的pythonpackage的文件
新建py工程與py文件
特殊字符
-
^: 表達(dá)必須以某一字符開(kāi)頭的含義,^1即為字符串以1開(kāi)頭. -
$: 結(jié)尾字符必須為x,例如3$就是說(shuō)明字符串是以3結(jié)尾 -
.: 替代一個(gè)任意字符(中英文 大小寫(xiě)等等) -
*: 某一字符重復(fù)多次,放在該字符后>=0 -
?: 服貪婪匹配方式,在量詞后面直接加上一個(gè)問(wèn)號(hào)?就是非貪婪模式。 -
+: 前面的字符必須至少出現(xiàn)一次 >=1 -
{2}: 限定前面字符出現(xiàn)的次數(shù),{2}表示限定前面的字符出現(xiàn)2次,{2,}表示前面一個(gè)字符出現(xiàn)大于兩次,{2,5}表示前面一個(gè)字符出現(xiàn)大于等于2次且小于等于5次 -
|: 表示或的關(guān)系,例如booby|booby123表達(dá)提取booby或booby123,哪個(gè)在前優(yōu)先匹配哪一個(gè)。 -
[]: 表示只要滿足中括號(hào)中的任意字符即可。 -
[0-9]表示范圍限制在0-9之間匹配任意數(shù)值均可。 - 中括號(hào)中的
*就是星號(hào),.就是點(diǎn)號(hào),不再具有上面所說(shuō)的特殊替代含義。 -
\s: 表示空格 小寫(xiě) -
\S: 只要不為空格都可以 大寫(xiě) -
\w: 表示任意字符[A-Z,a-z, 0-9,_],匹配字母或數(shù)字或下劃線或漢字 小寫(xiě) -
\W: 和\w相對(duì)應(yīng)的字符 大寫(xiě) -
[\u4E00-\u9FA5]: 代表漢字 -
\d: 代表數(shù)字
1. 匹配以b開(kāi)頭,后面為任意字符
import re #使用正則表達(dá)式的包
line="booby123"
regex_str="^b.*"
if re.match(regex_str,line): #re.match()是re包中的模塊
print("yes")
2.使用?克服貪婪匹配
import re
line="boooooobby123"
regex_str=".*(b.*b).*" #提取括號(hào)中的內(nèi)容
match_obj=re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))
輸出結(jié)果為:bb
貪婪匹配:正則表達(dá)式一般趨向于最大長(zhǎng)度匹配,也就是所謂的貪婪匹配。
非貪婪匹配:就是匹配到結(jié)果就好,就少的匹配字符。
當(dāng)兩側(cè)都無(wú)?控制的情況下,類似于反向匹配,即從右側(cè)開(kāi)始匹配(如上所示)
當(dāng)左側(cè)有?控制且右側(cè)無(wú)?控制的情況下,則從左側(cè)開(kāi)始匹配得到最長(zhǎng)的結(jié)果為止(如下所示)
import re
line="boooooobby123"
regex_str=".*?(b.*b).*"
match_obj=re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))
輸出結(jié)果為boooooobb
正確表達(dá)式應(yīng)為
import re
line="boooooobby123"
regex_str=".*?(b.*?b).*"
match_obj=re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))
3.使用+的實(shí)例
- 沒(méi)有使用+的情況
import re
line="boooooobnnvccbby123"
regex_str=".*(b.*b).*"
match_obj=re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))
結(jié)果:bb
- 使用+的情況
import re
line="boooooobnnvccbby123"
regex_str=".*(b.+b).*"
match_obj=re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))
結(jié)果:bnnvccbb
4.使用{}的實(shí)例
- 限定字符出現(xiàn)一次
import re
line="boooooobnnvccbaby123"
regex_str=".*(b.{1}b).*"
match_obj=re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))
結(jié)果:bab
- 限定字符出現(xiàn)1~3次
import re
line="boooooobnnvccbaaaby123"
regex_str=".*(b.{1,3}b).*"
match_obj=re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))
結(jié)果:baaab
5.使用|的實(shí)例
import re
line="booby123"
regex_str="(booby|booby123)"
match_obj=re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))
結(jié)果:booby
6.使用[]的實(shí)例
import re
line="booby123"
regex_str="([abcd]ooby123)"
match_obj=re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))
結(jié)果:booby123
7.使用[0-9]的實(shí)例
import re
line="15764289384"
regex_str="(1[3578][0-9]{9})"
#第一位數(shù)字為1,第二位數(shù)字為3 5 7 8 中的任意一個(gè),之后為9個(gè)0-9之間的字符
match_obj=re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))
結(jié)果:15764289384
8. 使用\s和\S的實(shí)例
import re
line="你 好"
regex_str="(你\s好)"
match_obj=re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))
結(jié)果:你 好
import re
line="你很不好"
regex_str="(你\S+好)"
match_obj=re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))
結(jié)果:你很不好
9. 使用\w和\W的實(shí)例
import re
line="你S好"
regex_str="(你\w好)"
match_obj=re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))
結(jié)果:你S好
10. 使用[\u4E00-\u9FA5]的實(shí)例
import re
line="你 好"
regex_str="([\u4E00-\u9FA5]+)"
match_obj=re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))
結(jié)果:你
import re
line="stydy in 南京大學(xué)"
regex_str=".*?([\u4E00-\u9FA5]+大學(xué))"
match_obj=re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))
結(jié)果:南京大學(xué)
11.使用\d的實(shí)例
import re
line="XXX出生于2001年"
regex_str=".*?(\d+)年"
match_obj=re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))
結(jié)果:2001年
正則表達(dá)式練習(xí)
匹配不同的出生日期寫(xiě)法:
import re
#line="XXX出生于2001年6月1日"
#line="XXX出生于2001/6/1"
#line="XXX出生于2001-06-01"
line="XXX出生于2001-06"
regex_str= '.*?出生于(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}|[月/-]$|$))'
match_obj=re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))

