Python网络数据采集的方法

听说还有很多小伙伴还不知道网络数据采集的方法,让我来看看都有谁,不说话我就点名了。我把教程分享在下面了,需要的小伙伴自己领取。(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>.*?)&nbsp.*?<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
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值