Python爬虫的实战技巧与案例分享
随着互联网的迅速发展,网络数据也越来越丰富,这些数据可以用于市场研究,数据分析等多种用途。然而,它们往往分散在不同的网站上,并且没有提供API。因此,通过编写爬虫程序可以很方便地获取这些数据。
本文将讲解Python爬虫的实战技巧,并结合实际案例分享如何利用爬虫获取数据。
1. 爬虫的基本原理
爬虫的基本原理是通过模拟人的行为去访问网页并提取数据。具体流程如下:
1)模拟发送请求:通过网络协议模拟浏览器发送请求,用来获取网页。
2)获取网页源码:将请求返回的HTML网页源代码获取下来,以便后续的数据提取。
3)解析网页内容:使用解析器或正则表达式等方法,从网页中提取目标内容。
4)持久化存储:将提取的信息存储到本地或者云端的数据库中,方便后续的数据分析和使用。
2. 实战技巧
2.1 User-Agent
User-Agent是指浏览器或爬虫发送请求时的身份标识,通过它可以判断请求是否是机器人发送的,防止网络爬虫被封禁。因此,我们需要在爬虫中设置User-Agent,使其模拟浏览器发送请求。
示例代码:
```python
import requests
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)
```
2.2 代理IP
为了防止网站屏蔽IP,我们可以在爬虫中使用代理IP进行访问,使用代理IP可以有效地减少被封禁的概率。
示例代码:
```python
import requests
proxies = {
'http': 'http://127.0.0.1:8080',
'https': 'https://127.0.0.1:8080',
}
response = requests.get(url, proxies=proxies)
```
2.3 Cookie
有些网站需要登录才能访问数据,因此我们需要在爬虫中使用Cookie模拟登录状态。
示例代码:
```python
import requests
cookies = {'name': 'value'}
response = requests.get(url, cookies=cookies)
```
2.4 验证码
有些网站需要输入验证码才能访问数据,我们可以使用OCR技术进行验证码识别,从而自动化爬取数据。
示例代码:
```python
import pytesseract
from PIL import Image
image = Image.open('captcha.png')
code = pytesseract.image_to_string(image)
```
3. 实际案例
3.1 爬取豆瓣电影数据
豆瓣电影是一个电影信息网站,我们可以从其中获取电影的评分、导演、演员、类型等信息。
首先,我们需要在豆瓣电影中搜索目标电影,获取电影的URL地址。然后,通过爬虫程序访问电影页面,提取目标信息。最后,将信息持久化到数据库中。
示例代码:
```python
import requests
import re
import pymongo
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client['douban']
collection = db['movies']
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'}
def get_movie_info(url):
response = requests.get(url, headers=headers)
html = response.text
pattern = re.compile('(.*?).*?(.*?).*?导演:(.*?)
.*?主演: (.*?)
.*?类型: (.*?)
', re.S)
items = re.findall(pattern, html)
movie = {}
movie['name'] = items[0][1]
movie['score'] = items[0][0]
movie['directors'] = items[0][2].split(' / ')
movie['actors'] = items[0][3].split(' / ')
movie['genres'] = items[0][4].strip().split(' / ')
collection.insert_one(movie)
if __name__ == '__main__':
urls = ['https://movie.douban.com/subject/26654498/', 'https://movie.douban.com/subject/26752088/']
for url in urls:
get_movie_info(url)
```
3.2 爬取链家房屋数据
链家是一个房屋信息网站,我们可以从其中获取房屋的价格、面积、地址等信息。
首先,我们需要在链家中搜索目标房屋,获取房屋的URL地址。然后,通过爬虫程序访问房屋页面,提取目标信息。最后,将信息持久化到数据库中。
示例代码:
```python
import requests
from bs4 import BeautifulSoup
import pymongo
client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client['lianjia']
collection = db['houses']
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'}
def get_house_info(url):
response = requests.get(url, headers=headers)
html = response.text
soup = BeautifulSoup(html, 'html.parser')
house = {}
house['title'] = soup.select('.main')[0].text.strip()
house['price'] = soup.select('.total')[0].text.strip()
house['location'] = soup.select('.info a')[0].text.strip()
house['area'] = soup.select('.info .area div')[0].text.strip()
house['room'] = soup.select('.room .mainInfo')[0].text.strip()
house['floor'] = soup.select('.room .subInfo')[0].text.strip().split('/')[0]
house['year'] = soup.select('.room .subInfo')[0].text.strip().split('/')[1]
collection.insert_one(house)
if __name__ == '__main__':
urls = ['https://bj.lianjia.com/ershoufang/101101710614.html', 'https://bj.lianjia.com/ershoufang/101101538590.html']
for url in urls:
get_house_info(url)
```
4. 总结
本文介绍了Python爬虫的基本原理和实战技巧,并结合实际案例分享了如何利用爬虫获取数据。通过学习本文,你将掌握基本的爬虫技能,能够快速构建爬虫程序,获取到你需要的数据。