听说还有很多小伙伴还不知道网络数据采集的方法,让我来看看都有谁,不说话我就点名了。我把教程分享在下面了,需要的小伙伴自己领取。(https://jq.qq.com/?_wv=1027&k=kYtMeTfp)
一般情况下以下四种方式都是可以匹配到结果的,只是复杂程度不一致,根据情况进行选择。
◾正则re的使用
◾bs4 的使用
◾xpath
◾PyQuery
① Re(Regular Expression 正则表达式)速度快效率高准确性高;
但使用起来可能相较于其他两种方法会更加的复杂多变,要学习的一些符号规则也会多一点。
② bs4(Beautiful Soup)最简单但执行起来效率并不高,它的原理是通过对HTML的标签、属性以及属性值来进行定位的。
③ xpath 语法规则比较舒服,使用起来效率更高更容易上手。
xpath是在XML文档中搜索内容的一门语言课,也是现在爬虫用的比较多的一种解析数据的方式。
④ PyQuery如果你熟悉jQuery,又不想再记一套BeautifulSoup的调用方法的话,那PyQuery是个很好的选择。
一、 正则re的使用
我们在解析数据时一般会用到几个常用的函数:
re.find() re.findall()
一个是找到一个便返回值,另一个是找到所有符合条件的值,里边的参数都是“pattern”,“字符串文本”。
•re.findall()
import re
str1='12s3asdfa'
mathch1 = re.findall("[0-9]",str1)
print(mathch1)
运行结果:[‘1’, ‘2’, ‘3’],匹配所有符合规则的字符。
re.match() re.search()
一个是从头开始匹配,一个是从任意位置开始匹配;
•re.match
import
restr1='123asdfa'
mathch1 = re.match("^[0-9]",str1)
print(mathch1.group())
运行结果:1;
•re.search
import
restr1='1a2s3asdfa'
mathch1 = re.search("^[0-9]",str1)
print(mathch1.group())
结果:1,从头到尾匹配字符,直到找到一个匹配,需要.group才能获取到匹配到的值。
re.serach()和re.match()的区别:
re.search()将匹配所有的字符,re.match只匹配字符串的开头,如果开头不符合规则,则返回None。
re.complie() re.finder() re.sub()
◾re.complie() re.finder() :返回迭代器
◾re.sub() :替换
re.sub(pattern, repl, string, count,flag)
import
restr1='12s3asdfa'
mathch1 = re.sub("[0-9]",'|',str1)
print(mathch1)
结果:||s|asdfa;用后面的字符替换前面的符合规则的字符。
利用最常用的方法compile()和findall()结合获取数据;
html = res.text
p=re.compile('<div class="movie-item-info">.*?<a href="/films/.*?title="(.*?)".*?<p class="star">\s+(.*?)\s+</p>.*?<p class="releasetime">(.*?)</p>',re.S)
result=re.findall(p,html)
注意观察compile()方法中的.?和(.?)
而(.?)就是我们要获取的信息,.?是省略掉的信息
例如:
html="abcd<hello world>abcd" p=re.compile('ab.*?<(.*?)>') result=re.findall(p,html)
此时result中的 内容就是hello world。
需要注意的是result是列表信息;
就是说我们可以保存多个数据(也就是说模板中可以有多个(.*?)),而且只要html中符合模板中空缺的数据,都会全部保存下来。
这个方法的基本思想是利用compile()构造出一个模板然后利用findall()将构造的模板去跟我们爬取的数据对比,找出我们需要的数据,也就是我们自己设置的模板中的(.*?)
补充:构建模板
找到你爬取的网页,点击f12,查看网页原码;
找到你要爬取的信息在源码中的位置;
把那部分源码复制下来,观察你所需要的信息,
合理利用.?以及(.?)即可获取到你自己想要
的信息。
案例:
# 拿到页面源代码, requests#
通过re来提取想要的有效信息 re
import csv
import requests
import re
# 伪装头
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
# 目标网址
url = "https://movie.douban.com/top250"
# 发送请求,获取响应
resp = requests.get(url, headers=headers)
page_content = resp.text
# print(page_content)
# 解析数据
obj = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)' r'</span>.*?<p class="">.*?<br>(?P<year>.*?) .*?<span ' r'class="rating_num" property="v:average">(?P<score>.*?)</span>.*?' r'<span>(?P<num>.*?)人评价</span>', re.S)
# 开始匹配 + 本地保存result = obj.finditer(page_content)f = open("data.csv", mode="w", enc