1.问题背景
1.1课题来源
课题来源于吉林省科技重点研发项目:大数据和移动互联时代的快速知识共享系统研究、开发与应用。该项目研究开发了《学术头条》APP,用户为学术界研究人员,功能包含:个性化推荐,热门发现,期刊会议的订阅,科技新闻,征稿信息,对论文的收藏,关键字的订阅,作者的订阅以及社区交流等。
1.2课题拟解决的问题
学术头条APP需要在互联网上发现作者的主页。本课题要解决的问题是训练一个文本的二分类器,并将其应用到爬虫中去实时区分爬取的网页是否为论文作者的主页。
1.3主要内容与目标
主要内容:将论文作者主页的发现问题抽象成一个文本的二分类任务,训练一个文本分类模型;将训练好的文本分类模型应用到爬虫系统中,能够实时的从互联网上发现论文作者的主页,并将其保存到数据库。
目标:在给定一个作者名字的情况下,能根据搜索引擎和分类模型找到作者的在主页,并将主页中作者信息显示到学术头条APP中。
2.具体目标
本篇具体完成爬虫部分的自动化在百度中检索作者并提取出作者主页作为目标页面的过程。
至于如何从各个目标页面中提取信息并判断此页面是否为作者的主页,涉及到机器学习的逻辑斯蒂回归等相关知识,后面再学习
3.思路
观察
4.代码
(已加入必要注释)
import urllib.parse
import urllib.request
from selenium import webdriver
from bs4 import BeautifulSoup
import os
import time
#把指定url页面解析为html后返回,可复用
def url_to_html(url):
req = urllib.request.Request(url)
#模仿浏览器访问页面,避免爬虫被识别
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36')
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
return html;
#返回中间搜索页面的url
def test1():
#打开一个浏览器对象,并进入百度页面
browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
#提取搜索框
input1 = browser.find_element_by_id('kw')
writer = input("Please input the writer you want to search:")
#向搜索框内输入检索内容
input1.send_keys('iPhone')
time.sleep(2)
input1.clear()
input1.send_keys(writer)
#提取“百度一下”按扭,并点击
button = browser.find_element_by_id('su')
button.click()
url = browser.current_url
time.sleep(5)
print(url)
return url
#提取中间搜索页面的前五个主链接
def test2(url):
print("this is test 2 ")
#print(url)
html = url_to_html(url)
#BeautifulSoup初始化,‘lxml’解析库
soup = BeautifulSoup(html,'lxml')
#声明空列表,获取中间搜索界面的前五个主链接,规律是前N个主链接,id值都为N
href_n = []
#循环id从1---5
for i in range(1,6):
#print(type(i))
#转化为string存入字典
i = str(i)
#print(type(i))
#得到bS4.element.tag类型的字典为{id:'1,2,3,4,5'}的div标签
idn = soup.find('div',{'id':i})
#从tag中获取a标签
a_n = idn.find('a')
#从a标签中获取href内容
href_n.append(a_n['href'])
for i in range(0,5):
print(href_n[i])
#返回包含前五个主链接的列表
return href_n
#打开一个目标页面
def test3(href_n):
browser = webdriver.Chrome()
browser.get(href_n)
if __name__ =="__main__":
html = test1()
for i in range(0,5):
test3(test2(html)[i])