1. python爬虫--正则表达式1

1. python爬虫–正则表达式1

标签(空格分隔):4.5python爬虫


一 python爬虫

1. 理解爬虫

image_1cv8aprrm6h618k41sv91c6j1ru313.png-72.1kB

image_1cv8as3jvekk1teabqmp811ebj1g.png-189.8kB

2.怎么爬取
image_1cv8ats4do2o1f1717a264dheq1t.png-149.8kB

3. 基础概念
image_1cv8bkq92g49cm4ufp137k1c6k2a.png-99.7kB
image_1cv8blqbqs9m1j6t150qffl33i2n.png-184.3kB


#二.网页结构

1. html结构

image_1cv8bns6f19vsn8lcdacom18u34.png-77kB

image_1cv8bovl61tif1g9v11mkolg1b5n3h.png-150.6kB

<> 标签
单标签 <!doctype html >

双标签


image_1cv8btipu40non9ekbh7fjpr4o.png-13.6kB

  • 网页由标签组成;
  • 不同的标签有不同的内容;
  • 可以通过 tagname / id / class 找到某个标签;

image_1cv8d98nv16nfc99101t71a1eaj7j.png-46.8kB

image_1cv8dbb57b5g1cii5s7dohle680.png-45.4kB

2. html各标签名
image_1cv8bq8jehthl3g1uuo193o1g6p3u.png-186.3kB

3. html样式
image_1cv8br97us921vn918tamsq1qt04b.png-170.3kB


三 获取百度网页代码

1. 通常打开一个网址的步骤

  1. 打开浏览器
  2. 输入网址
  3. 回车,访问

2. python打开网址

导入模块
import urllib

1.相当于打开了浏览器
from urllib import request

2.准备一个 url 地址
url = ‘http://www.baidu.com

3.访问网址,打开url (访问网址),会返回响应结果
response=request.urlopen(url)

4.读取结果
result = response.read() # read()读取函数,此处为还未解码的str
print(result) # 查看结果(未解码的str)
print(result.decode(‘utf-8’)) # 解码

  • 总结
    from urllib import request 打开浏览器(导入模块)
    url = ‘http://www.baidu.com’ 准备网址(输入网址)
    response=request.urlopen(url) 使用模块打开 url 返回访问结果 (回车,访问网址)
    result = response.read()
    print(result.decode(‘utf-8’)) 读取并解密编码
    image_1cv8c3982ftcsgv1mq31rks1ce855.png-31kB

四 搜索代码

1.获取网址

(1).打开网站—F12 或 检测(右键单击空白处)
image_1cv8cdulj1qj411ffrcr1pf0qmk5i.png-48.5kB

(2).选取图片方式
箭头选定,成为蓝色图标—选择图片
image_1cv8cg3rbh675c61tjv1s7a2ma5v.png-8kB

(3).获取图片地址

  • 方法1:

找到 src 标签—双击—复制—得到该图片网址
image_1cv8cjh7jbrf4ct1342dp28q46c.png-92.7kB

  • 方法2:

src 标签—右键单击—open in new tab(在新的网页中打开)—图片新网页地址—复制
image_1cv8co2cf1rucknr12ui1nbt1hkq6p.png-488.2kB

  • 方法1 会出现网址不全的情况,大多以方法2为主

2. python代码操作

(1)导入模块 and 函数
import urllib
from urllib import request

(2)准备网址
url=‘https://search.51job.com/list/000000,000000,0000,00,9,99,%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=

(3)打开网址
a=request.urlopen(url) # 调用request版块的打开网址函数的urlopen(‘网址’)

(4)读取内容(变量承接返回值 + 解码)
b=a.read()
print(b)
print(b.decode(‘gbk’))


五 urllib下载文件

导入函数
from urllib import request

1. 下载

  • 语法: request.urlretrieve(资源地址,保存的文件名)

request.urlretrieve(‘http://pic.netbian.com/uploads/allimg/180302/230357-1520003037f447.jpg’,'1.jpg’)

image_1cv9q3p5qad31cm713b4ih71bd7m.png-30.5kB

image_1cv9q2e4hk4f1g8r1e1g1g1dmjf9.png-277.7kB

  • 路径可能会不完整(以http开头),会导致保存失败

六 设置浏览器头部与代理

import random
from urllib import request

1. 把 url 包装为请求 request(url)
url=‘http://www.baidu.com
req=request.Request(url)
image_1cv9q6ijs1nki2prckl1gsb5d413.png-16.8kB

2. 增加浏览器头部的语法(网上搜索增加)

(1) 先获取自己浏览器的信息

req.add_header(‘User-Agent’,‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36’)

image_1cva5vfgan4jk4g5qobfq8un9.png-120.1kB
image_1cva68ac6nvg6j2f40j5f925m.png-11kB

(2)头部语法(网络搜索)

user_agent = [
“Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)”,
“Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)”,
“Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)”,
“Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)”,
“Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)”,
“Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)”,
“Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)”,
“Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)”,
“Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)”,
“Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6”,
“Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1”,
“Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0”,
“Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5”,
“Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6”,
“Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11”,
“Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20”,
“Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52”
]

(3) 随机取一个浏览器头部

import random
req.add_header(‘User-Agent’,random.choice(user_agent))

  • 需要导入 import random

ips = [
‘114.223.163.70:8118’,
‘116.7.176.75:8118’,
‘42.123.125.181:8088’,
‘175.165.145.179:1133’,
‘118.187.58.34:53281’
]

增加代理IP网站: https://www.xicidaili.com/(西刺代理)
检测IP有效性网站: http://www.xdaili.cn/monitor(讯代理)

(4) 随机使用一个浏览器访问

proxy_support=request.ProxyHandler({‘https’:random.choice(ips)})
open = request.build_opener(proxy_support)
request.install_opener(opener)

image_1cva7p5861ifjksfvrfclf1h2013.png-22.7kB

(5) 访问
result=request.urlopen(req)

(6) print()
print(result.read().decode(‘utf-8’))


#七 正则表达式

re.compile(‘表达式’)
默认情况下对大小写敏感

is 代表 一个 is
abc 代表 一个 abc
[abc] 代表 abc 中的一个值即可
[a-z] 代表 a-z 中的一个值即可
[A-Z] 代表 A-Z 中的一个值即可
[0-9] 代表 0-9 中的一个数值
1[0-9] 代表 10-19 中的一个数值

元字符
双\ 代表一个反斜杠
\d 表示 [0-9]中的一个字符
\D 表示一个 非 [0-9] 中的字符,非数字
\w 相当于[a-zA-Z0-9]
代表一个数字字母或者下划线(python中包括中文)
\W 对小写w取反
代表一个非 数字字母或者下划线(python中包括中文) 的值
\s 一个空白字符
\S 一个非空白字符
. 匹配任意单个字符(除\n外)
. 表示一个 .

量词(修饰前边的那个值出现的次数)
x{n} 表示x连续出现 n次
a{3}相当于aaa
\d{2-5} 2-5个连续的数字
{1,} 一次以上
{0,} 0次以上
{0,1} 0次或者1次

  • 相当于{1,}   一次以上
  • 相当于{0,}   0次以上

? 相当于{0,1} 0次或者1次,有或者没有

其他
(456) 一个整体456
| 在()内代表或

  • 任意字符表示一个邮箱 \[email protected]\w+.\w+
  • 身份证 表示方法: \d{17}(X|\d)

image_1cv828kfc12a7v151ogn1m3m1iqkm.png-39.8kB

  • 电话号码表示方法: (+86)?1[3456789]\d{9}

image_1cv820e9ln6a14ag1c2lak0ss39.png-58.8kB


re版块具体信息 https://www.cnblogs.com/wenwei-blog/p/7216102.html