爬虫学习2:爬虫爬取网页的信息与图片的方法

爬虫爬取网页的信息与图片的方法

爬取人物信息

python 复制代码
import requests

head = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
}
# 这是get请求带参数的模式
def get_param():
    # 1、url
    url = "https://www.sogou.com/web?"
    # 2、发送请求 get带参数使用params参数
    response = requests.get(url, headers=head, params={"query": "刘亦菲"})
    # 3、获取想要的数据
    with open("./dilireba.html", "w", encoding="utf8") as fp:
        fp.write(response.text)
        print(type(response.text))
    pass
get_param()

爬取动态变换的数据(如:翻译)

python 复制代码
import requests
def post_data():
    # 1、url
    url = 'https://fanyi.baidu.com/sug'

    # 2、发送请求
    response = requests.post(url, headers=head, data={"kw": "dog"})

    # 获取想要的数据
    print(response.json())
post_data()

爬取具体位置的数据的方法

python 复制代码
import requests
from lxml import etree
if __name__ == '__main__':
    tree = etree.parse("./test.html")#读取文件
    # xpath返回的都是列表
    # / 标识一个层级
    print(tree.xpath("/html/body/div/p"))#找到想要数据的位置
    print(tree.xpath("/html/head/title"))
    # 定位百里守约  索引定位 从1开始
    print(tree.xpath("/html/body/div[1]/p"))#读取第一个div的p
    print(tree.xpath("/html/body/div/p[1]"))#读取body下面所有div下的第一个p
    #
    print(tree.xpath("/html/body/div[2]/a[2]"))
    print(tree.xpath("/html/body/div[3]/ul/li[3]/a"))
    #
    # # // 标识多个层级 属性定位 attr = class id
    # 定位李清照
    print(tree.xpath("//div[@class='song']/p[1]"))
    #查看class或id 对应的信息是不是独一无二的,如是采用div[@class='song']这种形式,如不是查看其上一级是不是独一无二的。
    print(tree.xpath("//div[@class='song']/a[@class='du']"))

    # # 取所有的li标签
    print(tree.xpath("//div[@class='tang']/ul/li"))
    # # 取li标签内的所有a标签
    for li in tree.xpath("//div[@class='tang']/ul/li"):
        try:#数据正确
            print("".join(li.xpath("./a/text()")))#将列表形式变成字符串形式
        except Exception as e:#数据失败,执行下一个,不会影响其他数据执行
            pass
    #
    # # 取标签下的直系文本内容
    print(tree.xpath("/html/body/div[1]/p/text()"))
    # 取标签下的所有文本
    print(tree.xpath("/html/body/div[2]//text()"))
    # 取标签内的属性值 @attr_name
    print(tree.xpath("//div[@class='song']/img/@src"))


html 复制代码
test.html文件
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<title>测试bs4</title>
	</head>
	<body>
		<div>
			<p>百里守约</p>
		</div>
		<div class="song">
			你好
			<p>李清照</p>
			<p>王安石</p>
			<p>苏轼</p>
			<p>柳宗元</p>
			<a href="http://www.song.com/" title="赵匡胤" target="_self">
				<span>this is span</span>
			宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱</a>
			<a href="" class="du">总为浮云能蔽日,长安不见使人愁</a>
			<img src="http://www.baidu.com/meinv.jpg" alt="" />
		</div>
		<div class="tang">
			<ul>
				清明时节雨纷纷,路上行人欲断魂
				<li>
					<a href="http://www.baidu.com" title="qing">
						清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村
					</a>
				</li>
				<li>
					<a href="http://www.163.com" title="qin">
						秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山
					</a>
				</li>
				<li><a href="http://www.126.com" alt="qi">岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君</a></li>
				<li><a href="http://www.sina.com" class="du">杜甫</a></li>
				<li><a href="http://www.dudu.com" class="du">杜牧</a></li>
				<li><b>杜小月</b></li>
				<li><i>度蜜月</i></li>
				<li><a href="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a></li>
			</ul>
		</div>
	</body>
</html>

爬取网页(豆瓣TOP250的数据)

python 复制代码
# pip install fake_useragent
import time

import requests
import fake_useragent
from lxml import etree
import re

if __name__ == '__main__':
    # UA伪装
    head = {
        # "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
        "User-Agent": fake_useragent.UserAgent().random
    }

    # 打开一个文件写入数据
    fp = open("./doubanFilm.txt", "w", encoding="utf8")

    # 1、url
    # url = "https://movie.douban.com/top250"
    # url2 = "https://movie.douban.com/top250?start=25&filter="
    # url3 = "https://movie.douban.com/top250?start=50&filter="
    for i in range(0, 250, 25):#所有网页地址
        url = f"https://movie.douban.com/top250?start={i}&filter="
        time.sleep(5)
        # 2、发送请求
        response = requests.get(url, headers=head)
        # 3、获取想要的数据
        res_text = response.text
        # 4、数据解析
        tree = etree.HTML(res_text)
        # 定位所有的li标签
        li_list = tree.xpath("//ol[@class='grid_view']/li")  # 所有的li标签,包含信息
        for li in li_list:
            film_name = "".join(li.xpath(".//span[@class='title'][1]/text()"))  # 改成字符串形式
            director_actor_y_country_type = "".join(li.xpath(".//div[@class='bd']/p[1]/text()"))
            score = "".join(li.xpath(".//span[@class='rating_num']/text()"))
            quote = "".join(li.xpath(".//span[@class='inq']/text()"))
            # director_actor_y_country_type需要修改
            new_str = director_actor_y_country_type.strip()  # 去除空格
            y = re.match(r"([\s\S]+?)(\d+)(.*?)", new_str).group(2)  # 正则表达式方式
            country = new_str.rsplit("/")[-2].strip()
            types = new_str.rsplit("/")[-1].strip()
            director = re.match(r"导演: ([a-zA-Z\u4e00-\u9fa5·]+)(.*?)", new_str).group(1)

            try:
                actor = re.match(r"(.*?)主演: ([a-zA-Z\u4e00-\u9fa5·]+)(.*?)", new_str).group(2)
            except Exception as e:
                actor = "no"

            fp.write(
                film_name + "#" + y + "#" + country + "#" + types + "#" + director + "#" +
                actor + "#" + score + "#" + quote + "\n")  # 连接信息,连接符最好采用不常见的符号防止误读取
            print(film_name, y, country, types, director, actor, score, quote)

    fp.close()

爬取图片

python 复制代码
import os.path
import fake_useragent
import requests
from lxml import etree
# UA伪装
head = {
    "User-Agent": fake_useragent.UserAgent().random#自动伪装
}
pic_name = 0
def request_pic(url):
    # 2、发送请求
    response = requests.get(url, headers=head)
    # 3、获取想要的数据
    res_text = response.text
    # 4、数据解析
    tree = etree.HTML(res_text)
    li_list = tree.xpath("//div[@class='slist']/ul/li")#获取所有的照片信息
    for li in li_list:
        # 1、获取照片的url
        img_url = "https://pic.netbian.com" + "".join(li.xpath("./a/img/@src"))#img/@src,代表img的src属性
        # 2、发送请求
        img_response = requests.get(img_url, headers=head)
        # 3、获取想要的数据
        img_content = img_response.content
        global pic_name
        with open(f"./picLib/{pic_name}.jpg", "wb") as fp:#命名照片名称,并写下
            fp.write(img_content)
        pic_name += 1
if __name__ == '__main__':
    if not os.path.exists("./picLib"):#若没有一个此文件夹,建立一个文件夹存放照片
        os.mkdir("./picLib")
    # 1、url
    url = "https://pic.netbian.com/4kdongman/"
    request_pic(url)
    for i in range(2,10):#之后照片的url
        next_url = f"https://pic.netbian.com/4kdongman/index_{i}.html"
        request_pic(next_url)
    pass
相关推荐
belldeep1 小时前
python:reportlab 将多个图片合并成一个PDF文件
python·pdf·reportlab
dengqingrui1232 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
我的心永远是冰冰哒2 小时前
ad.concat()学习
学习
ZZZ_O^O2 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
吾爱星辰4 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
FreakStudio4 小时前
全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用
python·单片机·嵌入式·面向对象·电子diy
slomay4 小时前
关于对比学习(简单整理
经验分享·深度学习·学习·机器学习
丶21364 小时前
【CUDA】【PyTorch】安装 PyTorch 与 CUDA 11.7 的详细步骤
人工智能·pytorch·python
hengzhepa4 小时前
ElasticSearch备考 -- Async search
大数据·学习·elasticsearch·搜索引擎·es
_.Switch5 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j