引言
随着互联网的快速发展,数据成为了新时代的石油。Python作为一种高效、易学的编程语言,在数据采集领域有着广泛的应用。本文将详细讲解Python爬虫的原理、常用库以及实战案例,帮助读者掌握爬虫技能。
==(文末获取Python入门学习资料+视频教程+学习路线)==
一、爬虫原理
爬虫,又称网络爬虫,是一种自动获取网页内容的程序。它模拟人类浏览网页的行为,发送HTTP请求,获取网页源代码,再通过解析、提取等技术手段,获取所需数据。
1. HTTP请求与响应过程
爬虫首先向目标网站发送HTTP请求,请求可以包含多种参数,如URL、请求方法(GET或POST)、请求头(Headers)等。服务器接收到请求后,返回相应的HTTP响应,包括状态码、响应头和响应体(网页内容)。
2. 常用爬虫技术
(1)请求库:如requests、aiohttp等,用于发送HTTP请求。
(2)解析库:如BeautifulSoup、lxml、PyQuery等,用于解析网页内容。
(3)存储库:如pandas、SQLite等,用于存储爬取到的数据。
(4)异步库:如asyncio、aiohttp等,用于实现异步爬虫,提高爬取效率。
Python入门基础教程【文末有惊喜福利】
二、Python爬虫常用库
1. 请求库
(1)requests:简洁、强大的HTTP库,支持HTTP连接保持和连接池,支持SSL证书验证、Cookies等。
(2)aiohttp:基于asyncio的异步HTTP网络库,适用于需要高并发的爬虫场景。
2. 解析库
(1)BeautifulSoup:一个HTML和XML的解析库,简单易用,支持多种解析器。
(2)lxml:一个高效的XML和HTML解析库,支持XPath和CSS选择器。
(3)PyQuery:一个Python版的jQuery,语法与jQuery类似,易于上手。
3. 存储库
(1)pandas:一个强大的数据分析库,提供数据结构和数据分析工具,支持多种文件格式。
(2)SQLite:一个轻量级的数据库,支持SQL查询,适用于小型爬虫项目。
接下来将分享7个Python爬虫的小案例,帮助大家更好地学习和了解Python爬虫的基础知识。以下是每个案例的简介和源代码:
1. 爬取小说
import requests
from bs4 import BeautifulSoup
import time
def fetch_chapter_urls(base_url, chapters):
"""
从基础URL和章节列表中获取每个章节的完整URL。
这通常意味着你需要解析网站的目录或索引页面。
"""
chapter_urls = []
# 这里应该有一个循环来遍历章节,并构建每个章节的URL
# 但由于我们不知道具体的URL结构,所以这里只是假设
for chapter in chapters:
# 假设章节URL是基于基础URL和章节名的简单拼接
chapter_url = f"{base_url}/chapter-{chapter}.html"
chapter_urls.append(chapter_url)
return chapter_urls
def fetch_chapter_content(url):
"""
从给定的URL中获取小说章节的内容。
"""
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
response = requests.get(url, headers=headers)
if response.status_code != 200:
print(f"Failed to retrieve {url}")
return None
soup = BeautifulSoup(response.text, 'html.parser')
# 假设小说内容在<div class="chapter-content">标签内
content = soup.find('div', class_='chapter-content')
if content:
return content.text
else:
print(f"Content not found in {url}")
return None
def main(base_url, start_chapter, end_chapter):
# 假设我们知道章节号是从start_chapter到end_chapter
chapters = range(start_chapter, end_chapter + 1)
chapter_urls = fetch_chapter_urls(base_url, chapters)
for url in chapter_urls:
time.sleep(1) # 添加延时以避免过快请求导致的问题
content = fetch_chapter_content(url)
if content:
print(f"Chapter from {url}:")
print(content)
# 这里可以添加将内容保存到文件的逻辑
# 示例用法
base_url = 'http://example.com/novel/'
start_chapter = 1
end_chapter = 10
main(base_url, start_chapter, end_chapter)
注意:
-
选择器:
fetch_chapter_content
函数中的选择器(如class_='chapter-content'
)需要根据你的目标网站进行调整。 -
章节URL:
fetch_chapter_urls
函数中的URL构建逻辑也需要根据你的目标网站进行调整。有些网站可能需要在URL中包含章节的ID或其他标识符,而不是简单的章节号。 -
反爬虫措施:如果网站有反爬虫机制,你可能需要添加额外的headers、使用代理、调整请求频率(如上面的
time.sleep(1)
)或实现更复杂的逻辑来绕过这些限制。 -
数据存储:如果你打算保存爬取到的小说内容,你可以在
fetch_chapter_content
函数中添加逻辑来将内容写入文件或数据库。
2. 爬取猫眼电影Top100
这个案例使用正则表达式和requests库爬取猫眼电影Top100的电影名称、主演和上映时间等信息,并将这些信息保存到TXT文件中。
import requests
import re
# 请求URL
url = '<https://maoyan.com/board/4>'
# 请求头部
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
# 解析页面函数
def parse_html(html):
pattern = re.compile('<p class="name"><a href=".*?" title="(.*?)" data-act="boarditem-click" data-val="{movieId:\\\\d+}">(.*?)</a></p>.*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>', re.S)
items = re.findall(pattern, html)
for item in items:
yield {
'电影名称': item[1],
'主演': item[2].strip(),
'上映时间': item[3]
}
# 保存数据函数
def save_data():
f = open('maoyan_top100.txt', 'w', encoding='utf-8')
for i in range(10):
url = '<https://maoyan.com/board/4?offset=>' + str(i*10)
response = requests.get(url, headers=headers)
for item in parse_html(response.text):
f.write(str(item) + '\\\\n')
f.close()
if __name__ == '__main__':
save_data()
3. 爬取全国高校名单
这个案例使用正则表达式和requests库爬取全国高校名单,并将这些信息保存到TXT文件中。
import requests
import re
# 请求URL
url = '<http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html>'
# 请求头部
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
# 解析页面函数
def parse_html(html):
pattern = re.compile('<tr class="alt">.*?<td>(.*?)</td>.*?<td><div align="left">.*?<a href="(.*?)" target="_blank">(.*?)</a></div></td>.*?<td>(.*?)</td>.*?<td>(.*?)</td>.*?</tr>', re.S)
items = re.findall(pattern, html)
for item in items:
yield {
'排名': item[0],
'学校名称': item[2],
'省市': item[3],
'总分': item[4]
}
# 保存数据函数
def save_data():
f = open('university_top100.txt', 'w', encoding='utf-8')
response = requests.get(url, headers=headers)
for item in parse_html(response.text):
f.write(str(item) + '\\\\n')
f.close()
if __name__ == '__main__':
save_data()
4. 爬取中国天气网城市天气
这个案例使用xpath和requests库爬取中国天气网的城市天气,并将这些信息保存到CSV文件中。
Python入门基础教程【文末有惊喜福利】
import requests
from lxml import etree
import csv
# 请求URL
url = '<http://www.weather.com.cn/weather1d/101010100.shtml>'
# 请求头部
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
# 解析页面函数
def parse_html(html):
selector = etree.HTML(html)
city = selector.xpath('//*[@id="around"]/div/div[1]/div[1]/h1/text()')[0]
temperature = selector.xpath('//*[@id="around"]/div/div[1]/div[1]/p/i/text()')[0]
weather = selector.xpath('//*[@id="around"]/div/div[1]/div[1]/p/@title')[0]
wind = selector.xpath('//*[@id="around"]/div/div[1]/div[1]/p/span/text()')[0]
return city, temperature, weather, wind
# 保存数据函数
def save_data():
f = open('beijing_weather.csv', 'w', newline='', encoding='utf-8-sig')
writer = csv.writer(f)
writer.writerow(['城市', '温度', '天气', '风力'])
for i in range(10):
response = requests.get(url, headers=headers)
city, temperature, weather, wind = parse_html(response.text)
writer.writerow([city, temperature, weather, wind])
f.close()
if __name__ == '__main__':
save_data()
5. 爬取当当网图书信息
这个案例使用xpath和requests库爬取当当网图书信息,并将这些信息保存到CSV文件中。
import requests
from lxml import etree
import csv
# 请求URL
url = '<http://search.dangdang.com/?key=Python&act=input>'
# 请求头部
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
# 解析页面函数
def parse_html(html):
selector = etree.HTML(html)
book_list = selector.xpath('//*[@id="search_nature_rg"]/ul/li')
for book in book_list:
title = book.xpath('a/@title')[0]
link = book.xpath('a/@href')[0]
price = book.xpath('p[@class="price"]/span[@class="search_now_price"]/text()')[0]
author = book.xpath('p[@class="search_book_author"]/span[1]/a/@title')[0]
publish_date = book.xpath('p[@class="search_book_author"]/span[2]/text()')[0]
publisher = book.xpath('p[@class="search_book_author"]/span[3]/a/@title')[0]
yield {
'书名': title,
'链接': link,
'价格': price,
'作者': author,
'出版日期': publish_date,
'出版社': publisher
}
# 保存数据函数
def save_data():
f = open('dangdang_books.csv', 'w', newline='', encoding='utf-8-sig')
writer = csv.writer(f)
writer.writerow(['书名', '链接', '价格', '作者', '出版日期', '出版社'])
response = requests.get(url, headers=headers)
for item in parse_html(response.text):
writer.writerow(item.values())
f.close()
if __name__ == '__main__':
save_data()
6. 爬取新浪微博
这个案例使用selenium和requests库爬取新浪微博,并将这些信息保存到TXT文件中。
import time
from selenium import webdriver
import requests
# 请求URL
url = '<https://weibo.com/>'
# 请求头部
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
# 解析页面函数
def parse_html(html):
print(html)
# 保存数据函数
def save_data():
f = open('weibo.txt', 'w', encoding='utf-8')
browser = webdriver.Chrome()
browser.get(url)
time.sleep(10)
browser.find_element_by_name('username').send_keys('username')
browser.find_element_by_name('password').send_keys('password')
browser.find_element_by_class_name('W_btn_a').click()
time.sleep(10)
response = requests.get(url, headers=headers, cookies=browser.get_cookies())
parse_html(response.text)
browser.close()
f.close()
if __name__ == '__main__':
save_data()
希望这6个小案例能够帮助大家更好地掌握Python爬虫的基础知识!
爬虫注意事项与技巧
-
遵循Robots协议
-
尊重网站的爬虫协议,避免爬取禁止爬取的内容。
-
设置合理的请求间隔
-
避免对目标网站服务器造成过大压力,合理设置请求间隔。
-
处理反爬虫策略
-
了解并应对网站的反爬虫策略,如IP封禁、验证码等。
-
使用代理IP、Cookies等技巧
-
提高爬虫的稳定性和成功率。
-
分布式爬虫的搭建与优化
-
使用Scrapy-Redis等框架,实现分布式爬虫,提高爬取效率。
Python爬虫框架
-
Scrapy:强大的Python爬虫框架,支持分布式爬取、多种数据格式、强大的插件系统等。
-
Scrapy-Redis:基于Scrapy和Redis的分布式爬虫框架,实现分布式爬取和去重功能。
结语:
通过本文的讲解,相信读者已经对Python爬虫有了较为全面的认识。爬虫技能在数据分析、自然语言处理等领域具有广泛的应用,希望读者能够动手实践,不断提高自己的技能水平。同时,请注意合法合规地进行爬虫,遵守相关法律法规。祝您学习愉快!
关于Python学习指南
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!
**全套Python学习资料分享:
👉Python所有方向的学习路线👈
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)
👉学习软件
👉全套PDF电子书
👉实战案例
👉Python副业兼职路线&方法👈
学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。
👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取【保证100%免费
】