前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫基础

爬虫基础

原创
作者头像
用户6841540
发布2024-07-27 10:33:05
160
发布2024-07-27 10:33:05
举报
文章被收录于专栏:安义技术分享

请求网页的方法

requests包中的get方法,用来请求网页

代码语言:python
代码运行次数:0
复制
import requests

payload={'key1':'value1','key2'='value2'}

dat=requests.get('http://www.example.com',params=payload)#params参数收集传入是不定个数的参数,并将收集的到参数以元组的方式存储在params中,如果没有传入参数params就是个空元组

print(dat.url)

设置请求时间,避免程序一直与服务器连接。相关程序如下所示,设置超时时间为0.01s,超过这个时间就会自动断开,同时程序报错。

代码语言:python
代码运行次数:0
复制
#在0.01s设置等待时间,如果超过0.01s就会断开并报错

dat=requests.get('http://www.github.com',timeout=0.001)

查看服务器返回内容,直接打印text格式的response即可。

代码语言:python
代码运行次数:0
复制
#将返回的response对象打印出来,查看内容

import requests

dat=requests.get('http://api.github.com/events')

dat.text

requests库相关介绍

Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。请求发出后,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 r.text 之时,Requests 会使用其推测的文本编码。你可以找出 Requests 使用了什么编码,并且能够使用 r.encoding 属性来改变它. 

但是Requests库的自身编码为: r.encoding = ‘ISO-8859-1’ ,可以 r.encoding 修改编码,代码如下,修改为国际通用的UTF-8:

代码语言:python
代码运行次数:0
复制
url='http://music.baidu.com'

r=requests.get(url)

r.encoding='utf-8'

print(r.text)

当发起一个请求,requests会根据http的header进行编码

代码语言:python
代码运行次数:0
复制
import requests
dat=requests.get('http://baidu.com')  # dat.encoding 'ISO-8859-1'
dat.encoding='utf-8'#可以进行修改

post方法

一般post方法用于浏览器端给服务器端上传数据,如果使用post方法多次上传多数据,可用下面相关代码:

代码语言:python
代码运行次数:0
复制
import requests

payload={'key1':'value1','key2':'value2'}#payload=(('key1','value1'),('key1','value2'))//如果一个key对应多个值

dat=requests.post('http://httpbin.org/post',params=payload)#这个网址可以将传递的参数返回

print(dat.text)

代理IP

现在许多网站都有反爬机制,其中就有针对单一IP一次请求过于频繁采取封禁的机制,一般我们解决这种方法可以采用代理IP池,每次请求都用不同的IP发出,避免单一IP被检测。使用代理IP代码如下:

代码语言:python
代码运行次数:0
复制
# 使用代理IP,防止爬虫被ban

import requests

proxies={

    'http':'http://10.10.1.10:3128',

    'https':'https://10.10.1.10:1080',

}

# proxies={

#     'http':'http://user:pass@10.10.1.10:3128',

# }将用户名与密码写入

dat=requests.get('http://example.org')

但其实也不一定用这个就是为了反爬,而是针对一些需要代理的情况。我们一些地区的IP无法直接访问,第三方软件开启后,需要通过对应的端口,程序里就可以用这个。

查找与定位数据

BeautifulSoup在爬取过程中能快速定位到元素并提取数据,BeautifulSoup要获取某条数据首先要得到它的标签,然后找到这条标签里可以用来定位的属性,例如:class、id等。

Selenium是一个在网页上使用的自动化测试工具,可以将JS渲染出来。

下面的代码,Selenium只会寻找第一个匹配该属性的元素并返回,没有会报错:

代码语言:python
代码运行次数:0
复制
driver.find_element_by_tag_name('form')#利用tag标签定位,eg.<form></form>

Selenium还可以用xpath:可以匹配出所有符合条件元素,且定位到上一层或其他层

driver.find_element_by_xpath()

shift+鼠标右键,并在右键菜单中单击以此进入cmd控制台。

启动与关闭虚拟环境

代码语言:bash
复制
C:\Users\yezhoubing>d:

D:\>cd D:\virtualenv\ENV\Scripts

D:\virtualenv\ENV\Scripts>activate

extract

extract():这个方法返回的是一个数组list,,里面包含了多个string,如果只有一个string,则返回'ABC'这样的形式。extract_first():这个方法返回的是一个string字符串,是list数组里面的第一个字符串。相关内容如下:

代码语言:bash
复制
>>> response.xpath('//title/text()').extract_first()

'Scrapy | A Fast and Powerful Scraping and Web Crawling Framework'


>>> fetch("http://www.baidu.com")

2020-12-28 20:49:36 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.baidu.com> (referer: None)

>>> response.xpath('//title/text()').extract

<bound method SelectorList.getall of [<Selector xpath='//title/text()' data='百度一下,你就知道'>]>

本地html文件处理

代码语言:python
代码运行次数:0
复制
#用BeautifulSoup寻找本地html文件内容

from bs4 import BeautifulSoup

file=open("./test.html","rb")#以二进制读的方式打开相对路径下文件

test=file.read()

file.close()

bs=BeautifulSoup(test,"html.parser")#用html解析内容

print(bs.title)

print(bs.title.string)#用string可以只打印标签内的内容

print(type(bs.title.string))#NavigableString 标签里的内容(字符串)

print(bs.tr)#标签及其内容,但默认找到它的第一个内容

print(type(bs.p))

print(type(bs))#BeautifulSoup表示整个文档

print(bs)
代码语言:python
代码运行次数:0
复制
print(bs.a.string)

print(type(bs.a.string))#Comment 是一个特殊的NavigableString,输出的内容不包含注释符号

文档遍历

代码语言:python
代码运行次数:0
复制
#文档的遍历

print(bs.tr.contents)#多个内容会输出\n,内容以列表的形式存储

print(bs.tr.contents[1])#可以以列表输出的方式输出

文档搜索

按标签搜索
代码语言:python
代码运行次数:0
复制
tr_list=bs.find_all("tr")#find_all()查询所有,在这里是tr标签(字符串过滤:会查找与字符串完全匹配的内容)

print(tr_list)#以,间隔

    #正则表达式搜索:使用search()方法来匹配内容(注意一下grouop错误)
按正则搜索
代码语言:python
代码运行次数:0
复制
#正则表达式搜索:使用search()方法来匹配内容

tr_list=bs.find_all(re.compile("tr"))#只要有tr就被找到,不唯一

print(tr_list)
按参数搜索
代码语言:python
代码运行次数:0
复制
#参数搜索

tr_list=bs.find_all(id="head")#id为head元素被找到

tr_list=bs.find_all(class_=True)#只要有class就被找到
代码语言:python
代码运行次数:0
复制
#text参数搜索

tr_list=bs.find_all(text="123")#文本为123

tr_list=bs.find_all(text=["123","di"])#文本为123、di
代码语言:python
代码运行次数:0
复制
#limit参数搜索

tr_list=bs.find_all("tr",limit=2)#只要前两个tr

print(tr_list)
按css选择器搜索
代码语言:python
代码运行次数:0
复制
#css选择器

tr_list=bs.select("title")#找到title标签元素,以列表方式cun'chu

tr_list=bs.select(".mnav")#找到有mnav类元素(css中.表示类名)

tr_list=bs.select("#mnav")#找到有mnav id元素(css中#表示id名)

tr_list=bs.select("a[class='bri']")#找到有bri类名的a标签,通过属性查找

tr_list=bs.select("head>title")#找到有head下title元素,子标签

tr_list=bs.select(".mnav~.bri")#找到有与mnav同级的bri类,兄弟标签

print(tr_list)

print(tr_list[0].get_text())#打印文本内容

利用正则校验内容

通常我们需要在一个字符串中校验是否符合我们制定的规则,比如输入邮箱号是否有@,手机号是否为11位等,下面给出正则校验的相关代码:

代码语言:python
代码运行次数:0
复制
import re

pat=re.compile("AA")#此处的AA,是正则表达式,用来验证其他的字符串

m=pat.search("ADSAA")#search字符串被校验的内容

print(m)

#输出结果为span(3,5)而且只会匹配第一个AA
代码语言:python
代码运行次数:0
复制
import re

m=re.search("asd","Aasd")#前面的字符串是规则(模版),后面的是被校验的对象

print(m)
代码语言:python
代码运行次数:0
复制
import re

print(re.findall("[A-Z]","AFDShgcdSVXF"))#找到后面字符串中的所有大写字母
代码语言:python
代码运行次数:0
复制
import re

print(re.sub("a","A","AAAFDAaaa"))#在字符串中用的a用A代替

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 请求网页的方法
    • requests包中的get方法,用来请求网页
      • requests库相关介绍
        • post方法
          • 代理IP
            • 查找与定位数据
              • extract
              • 本地html文件处理
                • 文档遍历
                  • 文档搜索
                    • 按标签搜索
                    • 按正则搜索
                    • 按参数搜索
                    • 按css选择器搜索
                • 利用正则校验内容
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档