学习内容:
提示:url参数分析+Python爬虫
前期准备:
1、 安装requests、bs4第三方模块(可以用pip install 第三方模块名称)
2、 了解html的基本定位
3、 Python爬虫基本
基本思路:
1.通过Web of science的检索文章,并构造请求网址来获取页面html代码
2.将响应的html代码使用bs4模块中的Beautifulsoup将html进行解析并提取有效的内容
3.将有效内容储存成CSV表格
开始实操:
首先我们以打开Web of science的检索界面
这里我以搜索PHYSICAL EDUCATION AND SPORT PEDAGOGY为例,然后点击检索,然后就会出现我们想要的文章的信息
然后我们再点击文章的链接,查看具体信息:
这些信息基本都是对我们有用的,所以需要全部整理保存下来。
接下来就是重点了!!!就是要怎么获取这些文章。
通过查看url:
......
通过观察url的不同之处,就是doc=xxx,第一篇就是1,第二篇就是1,第n篇就是n,所以通过这个规律,我们就可以把522篇的文章的链接地址全部生成,然后再用Python的requests去访问地址,就可以把文章的html代码获取出来了
话不多说,上代码!
def main():
url_list = []
for i in range(1,523):
url = 'http://apps.webofknowledge.com/full_record.do?product=UA&search_mode=GeneralSearch&qid=1&SID=5BrNKATZTPhVzgHulpJ&page=1&doc=" + str(i) + "&cacheurlFromRightClick=no'
url_list.append(url)
print(url_list)
if __name__ == '__main__':
main()
OK,在url_list里头已经存储了我们需要的的所有文章的链接地址了,只要逐个请求就好了
接下来就是解析网页的信息,提取出我们想要的内容,通过浏览器的元素检查功能(快捷键F12),然后定位到我们想要的内容区域,然后复制他们的classname(也就是标签后面的class=xxx),这里可以看到标题的class是title,其他信息基本是block-record-info
当然到了这里或许有人问:为什么不用xpath或者css选择器之类的问题。通过多篇文章观察发现,页面的排版并不是特别的规律,所以我们不能直接简单的位置进行提取,而是通过class名,然后对其内容进行解析才可以判断出属于那一部分内容
所以接下来我就是通过Beautifulsoup进行解析html,然后将Beautifulsoup解析出的对象命名为soup,然后我通过编写一个类,来对soup进行解析,代码如下:
class Html_data:
def __init__(self, soup):
self.title = ''
self.author = ''
self.abstract = ''
self.keywords = ''
self.author_data = ''
self.data = ''
self.soup = soup
self.title = soup.find(attrs={'class':'title'}).text.replace('\n','')
try:
self.data = soup.find(attrs={'class':'block-record-info block-record-info-source'}).text
except:
pass
items = soup.find_all(attrs={'class':'block-record-info'})
for item in items:
if len(item.attrs['class']) > 1:
continue
if 'By:' in item.text:
self.author = item.text.replace('By:','').replace('\n','').replace(' ','').replace(' ]',']')
continue
elif 'Abstract' in item.text:
self.abstract = item.text
continue
elif 'Keywords' in item.text:
self.keywords = item.text
continue
elif 'Author Information' in item.text:
self.author_data = item.text
continue
通过这个Html_data类,将soup对象传入实例化Html_data类,就可以将其属性信息取出。
接下来我们就可以实操一下,将类实例化,并获取数据,将数据储存成csv。
以下代码接入main函数中url_list后面,代码如下:
for url in url_list:
# 遍历前面我们生成的所有文章的url
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
}
respon = requests.get(url, headers = headers)
if respon:
html = respon.text
soup = BeautifulSoup(html,'lxml')
Html_data = Html_data(soup)
# 获取对象信息
title = html_data.title
authors = html_data.author
abstract = html_data.abstract
authors_data = html_data.author_data
data = html_data.data
keywords = html_data.keywords
# 储存数据到csv
csv_data = [title, authors, abstract, authors_data, data, keywords, url]
print(csv_data)
with f = open('1.csv', encoding='utf-8', mode='a', newline='') as f:
csv_writer = csv.writer(f)
csv_writer.writerow(csv_data)
跑完所有url之后,在代码的运行目录下就会生成1.csv的表格文件,通过正则表达式提取和处理这些信息之后,就可以得到我们想要的内容(这里有空的部分,如abstract其实是有数据的,因为文字很多,第一行是换行符,所以显示空的),比如time、keyword都是用正则表达式提取出来的
本次文章到此结束了,主要还是以思路为主,代码也只是辅助理解,具体实现的代码需要自己自行修改。