定义
网络爬虫(Web Spider),又被称为网页蜘蛛,是一种按照一定的规则,自动地抓取网站信息的程序或者脚本。
简介
网络蜘蛛是一个很形象的名字。如果把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。网络蜘蛛是通过网页的链接地址来寻找网页,从 网站某一个页面开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。
爬虫流程
①先由urllib的request打开Url得到网页html文档
②浏览器打开网页源代码分析元素节点
③通过Beautiful Soup或正则表达式提取想要的数据
④存储数据到本地磁盘或数据库(抓取,分析,存储)
环境准备
需要python提供的现有功能包
requests
BeautifulSoup
pip intall requests
pip install BeautifulSoup
网站反扒机制
通过 User-Agent 来控制访问:
无论是浏览器还是爬虫程序,在向服务器发起网络请求的时候,都会发过去一个头文件:headers, 表明身份,对于爬虫程序来说,最需要注意的字段就是:User-Agent 很多网站都会建立 User-Agent 白名单,只有属于正常范围的 User-Agent 才能够正常访问。
解决方法:可以自己设置一下 User-Agent,或者更好的是,可以从一系列的 User-Agent 里随机挑出一个符合标准的使用 。
浏览器F12开发者模式:
设置请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
目的是让程序去模拟浏览器,通过设置代理和请求头,防止目标网站拒绝我们。
爬取自己的csdn主页
不得不说python把一个复杂的爬虫程序搞得这么简单,编写程序的人完全可以做一个傻子。
脑子还是要动起来的,最好还是要把其中的原理搞清楚,目的是,技术千变万化,原理不会变。
from bs4 import BeautifulSoup
import requests
url = 'https://blog.csdn.net/tom942067059'
def getSoup(target_url):
# 定制请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
#尝试获取网页信息,r为Response对象
r = requests.get(target_url, headers=headers)
#返回码
sc = r.status_code
print(sc)
# 设置编码格式
r.encoding = 'utf-8'
# 网页内容
context = r.text
# 解析网页
soup = BeautifulSoup(context, 'lxml')
return soup
def getContext():
soup = getSoup(url)
# 获取<div class='info clear'></div>所有标签项
h = soup.find_all('div', class_='article-item-box csdn-tracking-statistics')
#print(h)
for item in h:
# get blog URL
label_url = item.find('a', class_='')
the_url = label_url.attrs['href']
print('URL: '+the_url)
# get blog name
label_name = item.find('h4', class_='')
the_name = label_name.text
print(the_name)
# get blog publishe time
label_time = item.find('div', class_='info-box d-flex align-content-center')
time = label_time.find('span', class_='date')
the_time = time.text
print('发布时间:' +the_time)
# get the read number
read_num = label_time.find('span', class_='read-num')
the_read_num = read_num.text
print('访 问 量:'+the_read_num)
print('-----------------------------------------------------------------')
if __name__ == "__main__":
getContext()