1:先说一下什么是网络爬虫
爬虫顾名思义,(网络机器人,网页蜘蛛),是一总按照一定规则的进行自动爬取数据。
那么数据有事从何而来呢?
像百度、腾讯和阿里巴巴这样的BAT企业,本身就积累了大量的数据,所以他们玩起大数据来,多半是“闷声发大财”。
吾等屌丝没有数据,如何玩呢?
首先,你可以通过第三方购买数据,比如说,数据堂就有很多数据出售和分享;其次,你可以用爬虫爬回一些数据来存储;
那么我们就又说回来数据爬虫了,我们先说一下都有什么办法来爬取数据。
2:用request这个模块来进行爬虫:
下面是代码:
#先导入我们需要的模块
import urllib.request
# 在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后我们找个变量来接收
request = urllib.request.Request("http://www.china8823.top")
# Request对象作为urlopen()方法的参数,发送给服务器并接收响应
#urlopen,函数用于实现对目标url的访问
response = urllib.request.urlopen(request)
#将获取到的页面源码,转为字符串
html = response.read().decode('utf-8')
print (html)
那么就会有人问了有没有简单有速度快一点的方法呢!当然有了!请看下面。
3:在说一个简单又速度快的方法。
那就是XPath,我们可以先将 HTML文件 转换成 XML文档,然后用 XPath 查找 HTML 节点或元素。
什么是XPath? xpath (XML Path Language) 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。
那什么又是XML呢? XML可以理解为就是一个HTML文本语言(他可不是HTML语言只是类似),把我们需要爬取的数据网页转换成XML文本语言然后我们在去用XPath进行数据提取。
XPath:他呢表达式很简单
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选择属性。 |
下面是实例
#导入所需要的包
import os
import urllib
import urllib2
from lxml import etree
def qidianSpider(start_url):
get_noval_list_by_url(start_url)
def get_noval_list_by_url(req_url):
"""
#根据分页的url,获取分页的页面源码,提取小说的信息
#req_url:表示每一个分页的url
"""
#构建一个请求头
req_header = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
}
#发起请求,获取响应结果
response = requests.get(url=req_url,headers=req_header)
if response.status_code == 200:
#提取小说的信息
#使用etree.HTML可以将html文档源码,转为一个element对象,
#然后才能使用xpath语法
html_element = etree.HTML(response.text)
# div = html_element.xpath('/html/body/div[1]')
#div = html_element.xpath('/html/body/div[@class="share-img"]')
#src = html_element.xpath('//div[@class="share-img"]/img/@src')[0]
#提取小说列表
noval_lis = html_element.xpath('//ul[@class="all-img-list cf"]/li')
print(len(noval_lis))
print(noval_lis)
for noval_li in noval_lis:
#封面图片
coverImage = noval_li.xpath('./div[@class="book-img-box"]/a/img/@src')[0]
# coverImage = noval_li.xpath('./div[@class="book-img-box"]//img/@src')[0]
#标题
title = noval_li.xpath('./div[@class="book-mid-info"]/h4/a/text()')[0]
#作者
author = noval_li.xpath('.//a[@class="name"]/text()')[0]
print(coverImage, title, author)
if __name__ == '__main__':
start_url = 'https://www.qidian.com/all?orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page=1'
qidianSpider(start_url)
4:下面在说一下多线程爬虫吧,在什么情况下要用多线程,为什么要用多线程。
原因很简单:
因为我们之前写的爬虫都是单个线程的?这怎么够?一旦一个地方卡到不动了,那不就永远等待下去了?为此我们可以使用多线程或者多进程来处理。
一个简单的线程:
import threading
from time import sleep
def lyh(num,classname):
print(num,classname)
for i in range(5):
print('对不起' + str(i),threading.currentThread().name)
if __name__ == '__main__':
print('主线程开启'+threading.currentThread().name)
for i in range(5):
threed1 = threading.Thread(target=lyh,name='xiancheng',args=(10,1805))
#主线程结束后不会检查字线程是否完那程
#一旦诛仙程结束,字线程同时页结束
threed1.daemon=True
threed1.start()
print('主线程结束'+threading.currentThread().name)
#线程之间的执行是没有先后的,不知道会县执行哪一个