文章采集链接(Java开发中常见的一些链接数据汇总(一))
优采云 发布时间: 2022-02-25 19:19文章采集链接(Java开发中常见的一些链接数据汇总(一))
关键词:
当我看到办公桌上有一条银鱼时,我比普通的夫妻要好。本文章主要讲Python数据采集-启动爬虫相关知识,希望对大家有所帮助。
单个域名的遍历
网络爬虫就是抓取目标网页,然后遍历到数据信息,然后用链接继续遍历,以此类推。
第一步:获取页面上的所有链接
1 from urllib.request import urlopen
2 from bs4 import BeautifulSoup
3 import re
4
5 html = urlopen("https://www.yahoo.com/")
6 html_str = html.read().decode(‘utf-8‘)
7 #print(html_str)
8 bsObj = BeautifulSoup(html_str)
9 ##获取页面链接地址
10 for link in bsObj.findAll("a"):
11 if ‘href‘ in link.attrs:
12 print(link.attrs[‘href‘])
运行效果图
发现会有一些无用的数据。一些href值只作为页块跳转。我们可以使用正则表达式来优化过滤掉,只获取HTML结尾的链接
1 from urllib.request import urlopen
2 from bs4 import BeautifulSoup
3 import re
4
5 html = urlopen("https://www.yahoo.com/")
6 html_str = html.read().decode(‘utf-8‘)
7 #print(html_str)
8 bsObj = BeautifulSoup(html_str)
9 ##获取页面链接地址
10 for link in bsObj.findAll("a" ,href= re.compile(".*.html")):
11 if ‘href‘ in link.attrs:
12 print(link.attrs[‘href‘])
第 2 步:递归获取网页
第一步基本上是获取一个网页的所有链接地址,第二步显然是获取这些链接网页的链接,进而获取这些网页的数据。
比如我们获取Wiki中python条目下相关条目的链接。既然有我们不关心的链接,所有的链接都需要用正则表达式过滤掉,然后就有大量的链接链接。我们不能把它们全部用完。一些条款。
1 from urllib.request import urlopen
2 from bs4 import BeautifulSoup
3 import re
4 import datetime
5 import random
6
7 rd = random.seed(datetime.datetime.now())
8 print(rd)
9
10 def getLinks(articleUrl):
11 html = urlopen("https://en.wikipedia.org"+articleUrl)
12 bsObj = BeautifulSoup(html,"lxml")
13 return bsObj.findAll("a",href=re.compile("^(/wiki/)((?!:).)*$"))
14
15 links = getLinks("/wiki/Python")
16
17 while len(links) >0 :
18 #print(links)
19 newArticle = links[random.randint(0, len(links)-1)].attrs["href"]#随机获取一个来继续爬
20 print(newArticle)
21 links = getLinks(newArticle)
运行结果(一分钟产生150条数据,如果不手动停止,应该不会停止爬取)
两个采集整个网站
做所有链接采集到整个站点,当然有很多数据网站像wikis,几乎不可能采集全部。
1 from urllib.request import urlopen
2 from bs4 import BeautifulSoup
3 import re
4 pages = set()
5 def getLinks(pageUrl):
6 global pages
7 html = urlopen("http://en.wikipedia.org"+pageUrl)
8 bsObj = BeautifulSoup(html,"lxml")
9 try:
10 print(bsObj.h1.get_text())
11 print(bsObj.find(id="mw-content-text").findAll("p")[0])
12 print(bsObj.find(id="ca-edit").find("span").find("a").attrs[‘href‘])
13 except AttributeError:
14 print("页面缺少一些属性!不过不用担心!")
15 for link in bsObj.findAll("a", href=re.compile("^(/wiki/)")):
16 if ‘href‘ in link.attrs:
17 if link.attrs[‘href‘] not in pages:
18 # 我们遇到了新页面
19 newPage = link.attrs[‘href‘]
20 print("----------------
"+newPage)
21 pages.add(newPage)
22 getLinks(newPage)
23 getLinks("")
运行结果
递归爬取网页的原理:
三个使用 Scrapy采集
高楼大厦是由最简单的一砖一瓦堆砌而成,而编写一个网络爬虫也是由许多简单重复的操作组成,寻找页面的关键信息和外部链接,然后重复这个循环。Scrapy库可以大大减少对网页链接的搜索(不用自己做很多过滤条件和正则表达式),降低识别工作的复杂度。
使用参考;
第一步是创建一个Scrapy项目
报错,安装scrapy,cmd-pip install scrapy
错误,未安装视觉 14
重装成功,再次执行
scrapy startproject tutorial
创建成功后目录结构如下
第二步,定义数据源,修改item(参考官网)
第三步,创建爬虫类(参考官网)
第四步,进入spider目录,然后运行爬虫
错误,缺少 win32 库
点安装 pywin32
再次成功运行
第一个Scrapy helloworld基本完成,流程大致如下:
Scrapy 在 Spider 的 start_urls 属性中为每个 URL 创建一个对象,并将 parse 方法分配给 Request 作为回调。
Request对象被调度,生成的对象被执行并发回spider方法。
如果有用,以后继续深入学习Scrapy。
至此,这篇关于Python数据采集-启动爬虫的文章就讲完了。如果没有解决你的问题,请参考下面的文章: