用Python写一个的爬虫。对于Python这个脚本语言来说写爬虫不是一件很难的事情。 在写爬虫之前我们先了解一些简单的爬虫知识。 爬虫分类: 1. 通用网络爬虫 百度,门户网站 2. 聚焦网络爬虫 3. 增量式网络爬虫 4. 深层页面爬虫 简单爬虫架构: 1. URL管理器 Universal Resource Location 2. 网页下载器 3. 网页解析器 4. 输出管理器 Python实现网页解析的常用工具 1. 正则表达式 Regular Expression 2. Lxml库 Xpath语法 HTML XML <div> <p>你好</p> </div> 3. BeautifulSoup BS 常见爬虫框架 Scrapy 最流行 Pyspider 国人编写 Cola 分布式爬虫框架 下面我们先写一个简单的爬虫:
爬取百度logo >>> import requests >>> response = requests.get('https://www.baidu.com/img/bd_logo1.png') >>> with open('logo.png','wb') as logo: ... logo.write(response.content) ... response.text response.encoding response.content response.status_code 上述爬虫打开百度首页就可以看到一个百度的logo。我们做的事就是将那个logo爬出来。 简单的爬取像上述即可,当我们需要爬取很多数据的时候我们就需要将自己伪装一下,避免被爬取的网站将你的ID封掉。怎么做呢? 我们可以将请求头更换为一个浏览器做一个迷惑。 方法如下: 定制请求头 >>> headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3514.0 Safari/537.36'}
{}中间的User-Agent是怎么来的呢? 具体做法如下:下面是一个百度首页,我们按F12就会出现如下界面,没有的话刷新一下。 最下面我们就可以看到一个user-agent,这个东西就是请求头。我们复制即可。当然其他浏览器也可以。 下面我们就来做一个爬安居客租房信息: #爬取安居客西安租房信息 import requests #import引入各种库 from lxml import etree import csv import time import random from pip._vendor.msgpack.fallback import newlist_hint def spider(): #定义抓取函数 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3514.0 Safari/537.36'} #定制一个请求头,伪装成浏览器 prefix_url = 'https://xa.zu.anjuke.com/fangyuan/p'#爬取的网站页面 for i in range(1, 10 ): url = prefix_url + str(i) html = requests.get(url, headers=headers) selector = etree.HTML(html.text) house_list = selector.xpath('//*[@id="list-content"]/div') house_list=house_list[2:-2]#去除列表头尾不是房源列表的div for house in house_list: title = house.xpath('div[1]/h3/a/text()')[0] area = house.xpath('div[1]/p[1]/text()')[0] unit_price = house.xpath('div[2]/p/strong/text()')[0] span = house.xpath('div[1]/p[2]/span[1]/text()')[0] square = house.xpath('div[1]/p[1]/text()[2]')[0] print(title,area,unit_price,span,square) item = [title,area,unit_price,span,square]#保存数据 data_write(item) # 休息2-3秒 time.sleep(random.randint(2, 3)) def data_write(item):#定义保存函数 with open('fangyaun.csv','a',encoding='utf-8',newline='') as file: writer = csv.writer(file) writer.writerow(item) # 定义一个主函数 if __name__ == '__main__': spider()
一个简单的爬虫算是完成了。分享使人快乐,越分享、越快乐。