为了完成课程论文研究,暑假写了关于知乎的爬虫,把用户主页/回答中能爬到的数据全都爬下来了。接下来,把我踩过的坑跟大家分享,希望大家少走一些弯路!
1.导入一些必要的python包,其中会包括我们接下来要使用的函数;
import re
import urllib3
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support.ui import WebDriverWait
import time
import sys
import pymysql
#与数据库连接相关的模块
import random
#便于随机选择头部
import string
#修改数据类型时,对字符串的处理
import sqlite3
#写入csv操作
import csv
2.读取每个用户的url,便于之后直接登陆用户的个人主页,对其页面进行解析
db1 = pymysql.connect("。。。","。。。","。。。","。。。" )
cursor = db1.cursor()
sql_0="SELECT id from user"
cursor.execute(sql_0)
result_id = cursor.fetchall() #获取已经爬取的user_id存放在result_id中
result=list(result_id)
db1.close
3.新建csv文件,便于存储爬取、解析下来的数据。在这里也可以直接写入数据库中,但是为了后期数据处理、分析的方便,我们直接存储在了csv文件中
with open("文件路径","w") as csvfile:
writer = csv.writer(csvfile)
# 写入表头
writer.writerow([你的字段值])
csvfile.close()
4.到目前为止,我们已经建立好了存储文件,并且也有了用户个人主页的url,接下来就需要遍历每个用户的主页,爬取网页信息并进行解析了。这是一个机械重复的工作,因此我们选择了for循环。
5.对每个用户进行分析的过程:
首先是将个人网页信息爬取下来,
http = urllib3.PoolManager()
time.sleep(1)
response = http.request('GET',urls,cl_header)
content = BeautifulSoup(response.data)
再对爬取下来的信息进行解析,这里最关键的就是要找准你需要信息的网页标签、网页元素名称。
# 获取用户的基本信息:用户名、性别
user_info_sex = -1 #初始化
user_info_name = '' # 初始化
user_info_name = content.find('span','ProfileHeader-name').get_text() # 用户名
# 用户的性别是用一个标签判定的,这个标签可能出现也可能不出现
a = content.find_all('div','ProfileHeader-iconWrapper')
if len(a) == 0:
user_info_sex = -1
elif a[len(a)-1].svg['class'][1] == 'Icon--male':
user_info_sex = 1 #男性
elif a[len(a)-1].svg['class'][1] == 'Icon--female':
user_info_sex = 0 #女性
else:
user_info_sex = -1
#静态页面抓取 - 用户知识共享行为数据
user_info_answer = int(comb.join(list(filter(str.isdigit,content.find_all('span','Tabs-meta')[0].get_text())))) #回答数
user_info_ask = int(comb.join(list(filter(str.isdigit,content.find_all('span','Tabs-meta')[1].get_text())))) #提问数
user_info_article = int(comb.join(list(filter(str.isdigit,content.find_all('span','Tabs-meta')[2].get_text())))) #文章数
user_info_column = int(comb.join(list(filter(str.isdigit,content.find_all('span','Tabs-meta')[3].get_text())))) #专栏数
user_info_pins = int(comb.join(list(filter(str.isdigit,content.find_all('span','Tabs-meta')[4].get_text())))) #想法数
#静态页面抓取_3 - 平台对用户的粘性、社会资本等
user_info_followee = int(comb.join(list(filter(str.isdigit,content.find_all('strong','NumberBoard-itemValue')[0].get_text())))) #关注其他用户数
user_info_follower = int(comb.join(list(filter(str.isdigit,content.find_all('strong','NumberBoard-itemValue')[1].get_text())))) #粉丝数
#用户赞助live,及举办的live、关注问题数
#for j in range(0,len(content.find_all('span','Profile-lightItemName'))):
# user_info_attention = content.find_all('a','Profile-lightItem')[j].get_text()
#关注类别
最后写入到数据库中,这里我们还是写入到csv存储文件中
with open("存储文件路径及文件名","a+",newline='') as csvfile:
writer = csv.writer(csvfile)
# 写入数据
writer.writerow([你要写入的字段值])
csvfile.close()
以上就是获取用户基本信息的爬虫教程,我们再来进一步总结:
首先需要导入一些包、模块,里面会有我们爬取网页、解析网页内容需要的函数;
然后创建好数据库、存储文件,便于将数据直接写入;
前期工作准备好之后,再利用for循环对每个用户进行数据获取:先登录网页,再获取页面信息,然后从中根据页面元素解析出你需要的信息,并写入到数据库、存储文件中。
这就是网络爬取用户信息的全部步骤了。欢迎指正。