# 网络爬虫指南

##基本常识
网络爬虫是一种自动化程序,可以在互联网上自动收集信息。它可以访问网站并提取数据,然后将其存储在本地计算机上。网络爬虫可以用于各种用途,例如搜索引擎优化、数据挖掘和市场研究等。
响应头requests:
accept: 浏览器希望接收什么类型的文件

encoding:文件编码,解码的方式

host:域名

user-agent:浏览者的身份

referer:页面跳转来源

import requests#导入模块

网络爬虫的工作原理

网络爬虫的工作原理是通过发送HTTP请求来获取网页的HTML代码,然后解析HTML代码并提取所需的数据。网络爬虫通常使用正则表达式或XPath来解析HTML代码。

网络爬虫的工作流程如下:
1.明确目标URL。
2. 发送HTTP请求以获取网页的HTML代码。
3. 解析HTML代码并提取所需的数据。
4. 存储数据。

#**get请求:**

变量 = 'http://httpbin.org/get'#目标测试网站的url,要请求的资源地址,爬虫第一步

#为装备请求头,让别人以为我们是真人,注意:请求的时候带上,同理其他字段也可以伪装

变量 ={

'user-agent'#从真人访问处复制过来

}

response = requests.get(url = 变量,headers=变量)#get请求,可在此处传递参数

#1,直接写在url里末尾加上?变量=数据

#2,()里写入params={'变量'='数据'}键值对方式

#多个参数传递用&隔开,参数传在args里面

print(reponse.txt)#查看响应的内容,字符串形式

**post请求:**

变量 = 'http://httpbin.org/post'

response = requests.post(url = 变量,headers=变量)

传参:data={'变量'='数据'}#写如括号中,参数传在form中,不会在地址中显示,用get中的1方法在args中显示

#在response中CTRL+f可以查找指定响应数据

print(response.encoding)#查看编码方式

response.encoding=''#改变编码方式,解决乱码情况

#类似方法可查看response其他操作

#wd是请求传递的关键字参数

网络爬虫的分类

网络爬虫可以分为两类:通用网络爬虫和聚焦网络爬虫。

通用网络爬虫是一种可以访问互联网上所有网站的爬虫。它们通常用于搜索引擎优化和数据挖掘等领域。

聚焦网络爬虫是一种只访问特定网站的爬虫。它们通常用于市场研究和竞争情报等领域。

网络爬虫的工具

网络爬虫有许多工具可供使用。以下是一些常用的网络爬虫工具:

BeautifulSoup:一种用于解析HTML和XML代码的Python库。

和lxml一样,都是HTML或者xml的解析器,主要功能也是解析和提取xml或HTML数据

不同点:lxml是局部遍历,bs4是基于HTML dom,会载入整个文档,所以性能低,内存和时间开销大,但是用起来简单

导包:from bs4 import beautifulsoup

soup = Beautifulsoup(html,‘html.parser’) #html.parser为python自带的解析器

print(type(soup)) #打印出来为<class ‘bs4.Beautifulsoup’>

print(soup.prettify) #格式化

soup.标签名 可以拿到文档的第一个标签

soup.标签名.attrs 可以拿到所有属性

soup.标签名.attrs[‘属性名’] #拿到该属性值(attrs可省略)

soup.标签名.get(‘属性名’) #拿到该属性值

soup.标签名.[‘属性名’] =‘…’ #修改属性值

soup.标签名.string #获取标签文本内容

soup.标签名.text #获取标签文本内容

soup.标签名.get_text() #获取标签文本内容,包括子孙节点

#string得到标签下的文本内容 只有在这个标签没有子标签或者只有一个子标签的情况下才能返回其中的内容,否则返回none,且其和子标签只能有一个有文本内容

soup.find_all(‘a’) #查找所有a标签,列表格式,循环取出进行以上操作

筛选条件:

soup.find_all(‘a’,class_=‘’) #符合条件的a标签,可以多条件中间加上,

soup.find_all(text=‘…’) #根据内容匹配

Scrapy:一个用于构建网络爬虫的Python框架。

Selenium:一个用于自动化浏览器的工具,可以用于模拟用户行为。

json模块的使用:

json字符串转python字符串:json.loads()

python字符串转json字符串:json.dumps()

包含json的类文件对象转python数据类型:json.load()

python数据类型转包含json的类文件对象:json.dump()

#先读取json文件

dumps方法:

python字典可转化为json字符串,但是key必须为字符串,中文转化会乱码,所以设置第二个参数为false

json.dumps(待转化数据,ensrue_ascil=false,skipkeys=true#设置后不会触发typeerror的报错)

dump方法:

json.jump(文件中待转化数据,文件名,ensrue_ascil=false,skipkeys=true)

文件名.write(json.jump(文件中待转化数据,文件名,ensrue_ascil=false,skipkeys=true)

)#python转化为json,然后写入文件

loads方法类似参数只写第一个

load方法:

with open(‘文件名’,‘r’,encoding=‘utf-8’)as 别名:

别名.seek(0)#光标移动到前面,因为读取后光标在最后,而转化是整个文件为准从光标处开始

json.load(文件名)

数据解析之xpath:

lxml是HTML/XML的解析器,主要功能是如何解析和提取HTML/XML的数据

xpath是在XML文档中查找信息的语言,最初设计是搜寻xml文档,但是同样适用于HTML文档,可以把xpath看成lxml中的一个工具

from lxml import etree#导包

str=```#html文件格式写入

tree = etree.html(str)#将字符串解析为HTML文档

xpath常用规则:

nodename 选取此节点的所有子节点

/ 从当前节点选取直接子节点

// 从当前节点选取子孙节点,不管任何路径匹配符合条件的前提是第一个写

. 选取当前节点

… 选取当前节点的父节点

@ 选取属性

例如:

变量.xpath(‘//li/@class’)#所有li标签的class属性值

变量.xpath(‘//li’)

#匹配所有的li xpath返回的是列表 xpath没有匹配到时也会返回空列表

变量.xpath(‘//li/a’)#匹配li中的a标签

#lxml是html/xml的解析器,功能为解析和提取数据 xpath是在xml文档中查找信息的语言最初设计是查找xml文档但是同时适用于html文档

xpath写入条件:变量.xpath(‘//li/a[]’)#[]中写入条件,如@class=‘…’

tree.xpath(‘//li[1]/a’)#取到第一个li中的a标签,可以用索引取值,但索引开头为1

tree.xpath(‘//li[last()]/a’)#取到最后一个li中的a标签

tree.xpath(‘//li[last()-1]/a’)#取到倒数第二个li中的a标签

tree.xpath(‘//li/a[1]/@class’)#取到所有值,xpath为遍历查找,搜寻的是li下面的a相当于每一个是第一个,可以通过()提升优先级来解决

tree.xpath(‘(//li/a)[1]/@class’)

变量.xpath(‘//li/a/text()’)#查找a标签中的内容

tree.xpath(‘//li/a//@class’)#取到a以及以下标签中的class属性值
xpath高级

"""

from lxml import etree

tree = etree.parse('02-xpath高级.html') # etree.parse直接接受一个文档,按照文档结构解析(本地文件)
print(tree.xpath('//@code'))  # 匹配所有带有code属性的属性值

""" 选取若干路径 | """

#这个符号用于在一个xpath中写多个表达式用,用|分开,每个表达式互不干扰

print(tree.xpath('//div[@id="testid"]/h2/text() | //li[@data]/text()'))
print(tree.xpath('//li[@data]/text() | //div[@id="testid"]/h2/text()'))  # 顺序是根据HTML页面来的
#
""" child:选取当前节点的所有子元素 """

#child子节点定位

print(tree.xpath('//div[@id="testid"]/child::ul/li/text()'))

#child::*当前节点的所有子元素

print(tree.xpath('//div[@id="testid"]/child::*'))

#定位某节点下为ol的子节点下的所有节点内容

print(tree.xpath('//div[@id="testid"]/child::ol/child::*/text()'))
#
""" attribute:选取当前节点的所有属性 """

#attribute定位id属性值

print(tree.xpath('//div/attribute::id'))  # attribute定位id属性值

#定位当前节点的所有属性

print(tree.xpath('//div[@id="testid"]/attribute::*'))
#

#ancestor

""" ancestor:父辈元素 / ancestor-or-self:父辈元素及当前元素 """

#定位父辈div元素的price属性

print(tree.xpath('//div[@id="testid"]/ancestor::div/@price'))

#所有父辈div元素

print(tree.xpath('//div[@id="testid"]/ancestor::div'))

#所有父辈及当前节点div元素

print(tree.xpath('//div[@id="testid"]/ancestor-or-self::div'))
#
""" following :选取文档中当前节点的结束标签【之后】的所有节点 """

#定位testid之后不包含id属性的div标签下所有的li中第一个li的text属性

print(tree.xpath('//div[@id="testid"]/following::div[not(@id)]//li[1]/text()'))
print(tree.xpath('//div[@id="testid"]/following::div[@id="go"]//li[1]/text()'))
#
""" preceding:选取文档中当前节点的开始标签【之前】的所有节点 """

#记住是标签开始之前,同级前节点及其子节点

print(tree.xpath('//div[@id="testid"]/preceding::div/ul/li[1]/text()'))
#
""" parent:选取当前节点的父节点 """

#选取data值为one的父节点的子节点中最后一个节点的值

print(tree.xpath('//li[@data="one"]/parent::ol/li[last()]/text()'))
print(tree.xpath('//li[@data="one"]/parent::div/@aaa')) # 选不到  加个父级才能选到 给li加父级div
#
""" 函数 """
""" count:统计 """

#节点统计

print(tree.xpath('count(//li[@data])'))

""" concat:字符串连接 """
print(tree.xpath('concat(//li[@data="one"]/text(),//li[@data="three"]/text())'))
print(tree.xpath('concat(//li[@code="84"]/text(),//li[@code="223"]/text())'))
#
""" contains(string1,string2):如果 string1 包含 string2,则返回 true,否则返回 false """
print(tree.xpath('//h3[contains(text(),"这里")]/a/text()'))
print(tree.xpath('//div[@id="go"]//li[contains(@class,"it1")]/text()'))
#

#""" not:布尔值(否) """

#不包含data属性的li标签统计

print(tree.xpath('count(//li[not(@data)])'))

网络爬虫的法律问题

网络爬虫可能会侵犯网站的版权和隐私。因此,使用网络爬虫时需要遵守相关法律法规。以下是一些需要注意的法律问题:

  1. 知识产权:网络爬虫可能会侵犯网站的版权、商标和专利等知识产权。
  2. 隐私:网络爬虫可能会收集用户的个人信息,因此需要遵守相关隐私法规。
  3. 网络安全:网络爬虫可能会对网站造成安全威胁,因此需要遵守相关网络安全法规。

网络爬虫是一种强大的工具,可以用于各种用途。但是,使用网络爬虫时需要遵守相关法律法规,以避免侵犯他人的权益。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

X_papada

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值