python进阶———网络爬虫

网络爬虫

python进阶———网络爬虫_第1张图片
python进阶———网络爬虫_第2张图片
python进阶———网络爬虫_第3张图片
python进阶———网络爬虫_第4张图片
python进阶———网络爬虫_第5张图片
python进阶———网络爬虫_第6张图片
python进阶———网络爬虫_第7张图片python进阶———网络爬虫_第8张图片
python进阶———网络爬虫_第9张图片

python进阶———网络爬虫_第10张图片

python进阶———网络爬虫_第11张图片
python进阶———网络爬虫_第12张图片
python进阶———网络爬虫_第13张图片
2.1 发送请求

导入 Requests 模块:

import requests

获取网页:

r = requests.get('http://xxx.xxx')

此时,我们获取了 Response 对象 r,我们可以通过 r 获取所需信息。Requests 简便的 API 意味着所有 HTTP 请求类型都是显而易见的,我们来看一下使用常见 HTTP 请求类型 get、post、put、delete 的示例:

r = requests.get('http://xxx.xxx/get')
r = requests.post('http://xxx.xxx/post', data = {'key':'value'})
r = requests.put('http://xxx.xxx/put', data = {'key':'value'})
r = requests.delete('http://xxx.xxx/delete')

通常我们会设置请求的超时时间,Requests 使用 timeout 参数来设置,单位是秒,示例如下:

r = requests.head('http://xxx.xxx/get', timeout=1)

2.2 参数传递

在使用 get 方式发送请求时,我们会将键值对形式参数放在 URL 中问号的后面,如:http://xxx.xxx/get?key=val ,Requests 通过 params 关键字,以一个字符串字典来提供这些参数。比如要传 key1=val1 和 key2=val2 到 http://xxx.xxx/get,示例如下:

pms= {'key1': 'val1', 'key2': 'val2'}
r = requests.get("http://xxx.xxx/get", params=pms)

Requests 还允许将一个列表作为值传入:

pms= {'key1': 'val1', 'key2': ['val2', 'val3']}

注:字典里值为 None 的键都不会被添加到 URL 的查询字符串里。
2.3 响应内容

我们来获取一下服务器的响应内容,这里地址 https://api.github.com 为例:

import requests
r = requests.get('https://api.github.com')
print(r.text)

# 输出结果
# {"current_user_url":"https://api.github.com/user","current_user...

当访问 r.text 之时,Requests 会使用其推测的文本编码,我们可以使用 r.encoding 查看其编码,也可以修改编码,如:r.encoding = ‘GBK’,当改变了编码,再次访问 r.text 时,Request 都将会使用 r.encoding 的新值。

1)二进制响应内容 比如当我们要获取一张图片的数据,会以二进制的方式获取响应数据,示例如下:

from PIL import Image
from io import BytesIO
i = Image.open(BytesIO(r.content))

2)JSON响应内容 Requests 中已经内置了 JSON 解码器,因此我们可以很容易的对 JSON 数据进行解析,示例如下:

import requests
r = requests.get('https://api.github.com')
r.json()

注:成功调用 r.json() 并不一定响应成功,有的服务器会在失败的响应中包含一个 JSON 对象(比如 HTTP 500 的错误细节),这时我们就需要查看响应的状态码了 r.status_code 或 r.raise_for_status(),成功调用时 r.status_code 为 200,r.raise_for_status() 为 None。
2.4 自定义请求头

当我们要给请求添加 headers 时,只需给 headers 参数传递一个字典即可,示例如下:

url = 'http://xxx.xxx'
hds= {'user-agent': 'xxx'}
r = requests.get(url, headers=hds)

注:自定义 headers 优先级是低于一些特定的信息的,如:在 .netrc 中设置了用户认证信息,使用 headers 设置的授权就不会生效,而当设置了 auth 参数,.netrc 的设置会无效。所有的 headers 值必须是 string、bytestring 或者 unicode,通常不建议使用 unicode。

练习:
爬取安全客的标题

import re
import requests
import time

url = "https://www.anquanke.com/"
# header伪装
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}
# 获取网页内容
req = requests.get(url, headers)
# 获取网页状态码
# print(req)
# 获取全部网页内容
# print(req.text)

# 将内容保存到本地文件中
with open("anquanke.txt", "w", encoding="utf-8") as f1:
    data = f1.write(requests.get(url).text)

# 读取本地文件
with open("anquanke.txt", "r", encoding="utf-8") as f2:
    content = f2.read()

    # 表达式原内容
    # 智在粤港澳,阿里云原生安全2.0应运而生
    # 编写表达式
    m = re.findall('(.*?)', content)

    print(f"安全客安全监测与响应中心 每日安全热点\t{time.strftime('%Y-%m-%d')}\n")
    # 获取网页标题及链接
    num = 9
    for i in m:
        print(f"标题{len(m) - num}{i[1]}")
        print(f"链接:https://www.anquanke.com/{i[0]}")
        num -= 1

爬取图片

import requests
import re

"""
1.确定网址
2.搭建关系 发送请求 接受响应
3.筛选数据
4.保存本地
"""

url = 'https://wallspic.com/tag/iphone/for_mobile'

response = requests.get(url = url).text

contentUrl = re.findall(r'contentUrl":"(https://img\d.wallspic.com/crops/.*?)"', response)

j = 0
for i in contentUrl:
    # print(contentUrl)
    j += 1
    Content = requests.get(url = i).content
    print(Content)
    with open(f'Wallspic-{j}.jpg', mode = 'wb') as f:
        f.write(Content)
        print(f'[+] 已保存完成{j}张壁纸!')
        

爬取网易云音乐歌单的歌名和歌手

import requests
import fake_useragent
import re

"""
1.确定网址
2.搭建关系 发送请求 接受响应
3.筛选数据
4.保存本地
"""

#

url = "https://music.163.com/discover/toplist?id=3778678"
ua = fake_useragent.UserAgent()

header = {
    'user-agent': ua.random
}
response = requests.get(url = url, headers = header)
r = response.text
# print(r)
response.close()

# 包含歌曲和歌曲链接的一段字符串
# 
  • 我记得
  • all = ''.join(re.findall(r'
      (.*?)
    '
    , r)) # print(all) # 从 all 里提取歌名 #
  • 我记得
  • name = re.findall(r'(.*?)', all) # 从 all 里提取歌曲地址 song_url = re.findall(r'.*?', all) # 从页面全部源代码中提取歌手的信息 # "artists":[{"id":6731,"name":"赵雷","tns":[],"alias":[]}],"stat singer = re.findall(r'"artists":\[{"id":.*?,"name":"(.*?)",', r) # 打印 for i in range(len(name)): print(name[i], '\t', singer[i], '\t', song_url[i])

python进阶———网络爬虫_第14张图片

练习
爬取QQ音乐歌单

import requests
from fake_useragent import UserAgent
import re
from lxml import etree
import csv
import time


# 打开csv文件
f = open('QQ音乐热歌榜单.csv', mode = 'w', newline = '', encoding = 'utf-8-sig')
w_headers = csv.DictWriter(f, fieldnames = ['歌名','歌手','歌曲地址'])
w_headers.writeheader()

# 目标地址
url = 'https://y.qq.com/n/ryqq/toplist/4'

# 请求头
headers = {
    'user-agent' : UserAgent().random
}

time.sleep(2)

#发送请求
response = requests.get(url = url, headers = headers)
html = response.text

#### xpath 解析提取
h = etree.HTML(html)

Dict = {}
data = h.xpath('//div[@class="songlist__item songlist__item--even"]')[0]
Dict['歌名'] = data.xpath('//div[@class="songlist__songname"]/span/a[2]/text()')
Dict['歌手'] = data.xpath('//div[@class="songlist__artist"]/a/text()')
s = 'https://y.qq.com'
src = data.xpath('//div[@class="songlist__songname"]/span/a[2]/@href')
print(src)
for i in range(0,len(src)):
    src[i] = s + src[i]
Dict['歌曲地址'] = src

w = {}
for i in range(0, 20):
    w['歌名'] = Dict['歌名'][i]
    w['歌手'] = Dict['歌手'][i]
    w['歌曲地址'] = Dict['歌曲地址'][i]
    w_headers.writerow(w)
    print(f'[*] 已保存完成{i+1}首歌曲信息')

### re正则表达式解析提取数据
Dict = {}
title = re.finditer(r'(?P.*?)<.*?,html)
j = 0
for i in title:
    j += 1
    Dict['歌名'] = i.group('name')
    Dict['歌手'] = i.group('singer')
    Dict['歌曲地址'] = 'https://y.qq.com' + i.group('src')
    w_headers.writerow(Dict)
    print(f'[*] 已保存完成{j}首歌曲信息')

爬取链家的房源信息

import csv
import requests
import fake_useragent
from lxml import etree

f = open('链家租房信息.csv', mode = 'w', newline = '', encoding = 'utf-8-sig')
writer = csv.DictWriter(f, fieldnames = ['地区','小区','简介','月租'])
writer.writeheader()

for i in range(1, 4):
    ua = fake_useragent.UserAgent()
    url = "https://bj.lianjia.com/zufang/pg{}/".format(i)
    header = {"User-Agent": ua.random}
    # 访问获取源代码
    r = requests.get(url = url, headers = header).text
    # print(r)
    html = etree.HTML(r)

    # 先获取整个列表
    data = html.xpath('//div[@class="content__list"]//div[@class="content__list--item"]')
    print(data)
    #再循环挨个提取相关信息
    for i in data:
        # 创建一个字典,把信息放到字典里面
        # 方便后期保存
        d = {}
        d['地区'] = i.xpath('.//p[@class="content__list--item--des"]/a[1]/text()')
        d['小区'] = i.xpath('.//p[@class="content__list--item--des"]/a[3]/text()')
        d['简介'] = i.xpath('.//p[@class="content__list--item--des"]/text()')
        d['月租'] = i.xpath('.//span[@class="content__list--item-price"]/em/text()')
        print(d)
        writer.writerow(d)

爬取漏洞库的漏洞信息

import csv
import requests
import fake_useragent
from lxml import etree

f = open('漏洞库.csv', mode = 'w', newline = '', encoding = 'utf-8-sig')
writer = csv.DictWriter(f, fieldnames = ['Title', 'EDB-ID', 'CVE', 'Author', 'Type', 'Date', 'DOWNLOAD'])
writer.writeheader()

ua = fake_useragent.UserAgent()
#url = 'https://www.exploit-db.com/exploits/51467'
header = {
    'user-agent': ua.random
}

zzz = []
for i in range(0,300):
    zzz.append(f"https://www.exploit-db.com/exploits/{51515-i}")

for i in range(0,300):
    req = requests.get(url=zzz[i], headers=header)
    if int(req.status_code) == 200:
        h = etree.HTML(req.text)
        Dict = {}
        Dict['Title'] = h.xpath('//div[@class="row justify-content-md-center"]/h1/text()')
        b = h.xpath('//div[@class="info info-horizontal"]/div')[0]
        Dict['EDB-ID'] =b.xpath('//div[@class="col-6 text-center"]/h6/text()')
        Dict['CVE'] = b.xpath('//div[@class="col-6 text-center"]/h6/text()')
        Dict['Author'] = b.xpath('//div[@class="col-6 text-center"]/h6/text()')
        Dict['Type'] = b.xpath('//div[@class="col-6 text-center"]/h6/text()')
        Dict['Date'] = b.xpath('//div[@class="col-6 text-center"]/h6/text()')
        asd = h.xpath('//div[@class="stats h5 text-center"]/a[1]/@href')
        Dict['DOWNLOAD'] = f"https://www.exploit-db.com{asd[0]}"
        print(Dict)
        writer.writerow(Dict)

你可能感兴趣的:(python,爬虫,数学建模)