Python爬虫实践(一) -- 社交网站用户信息爬取

目录

爬虫项目目标

过程原理分析

最终实现代码


爬虫项目目标

给一个FB的用户ID,爬这个用户的所有内容

比如发帖情况、帖子转发情况,被谁赞,赞的人的名字,评价评论,他的朋友,他的个人信息。

过程原理分析

原理:并不用fq,只是理论层次的研究。

简单爬虫脚本:selenium即可。

爬虫框架:FB中大量采用异步加载,如果简单收发包必定很多内容是解析不到的,因此这里需要一个JavaScript渲染引擎,这个引擎可以使用selenium + chrome(handless) 。

开发语言:python3 ,python在开发爬虫方面有独特的优势。

开发工具:pycharm, JB的pycharm几乎是Python IDE的首选。

程序具体步骤:用户登录。使爬虫保持登录状态。获取用户主页面。获取时间线信息。获取公共主页的发帖信息。获取好友信息。反爬虫的相关操作。

防止封号可以采取的措施:

1、减少并发数,设置发包延时

2、设置代 理 池

3、设置UA

4、设置多用户登录,通过从用户的登录cookie池中随机选取一个作为请求的cookie,在爬虫开始位置导入多个用户的用户名和密码信息,依次登录,登录成功后保存用户cookie到列表,后面每次发包前随机选取一个cookie

5、设置Reuqests函数的等待时间,减慢爬虫运行速度防止由于发包过快导致账号被封

最终实现代码

最终选择使用selenium来简单爬取。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time


class FBSpider(object):

    def __init__(self):
        print("==============================")
        # 选择浏览器
        self.browser = webdriver.Chrome()
        # browser.implicitly_wait(10)
        # browser.set_window_size(0,0)
        # 访问facebook网页 # 网络容易出错
        self.browser.get('网址')
        time.sleep(1)
        # 输入模拟登陆的账户密码
        self.browser.find_element_by_id('email').clear()
        self.browser.find_element_by_id('email').send_keys('******')
        self.browser.find_element_by_id('pass').clear()
        self.browser.find_element_by_id('pass').send_keys('******')
        time.sleep(1)
        # 模拟点击登录按钮,两种不同的点击方法
        try:
            self.browser.find_element_by_xpath('//button[@id="loginbutton"]').send_keys(Keys.ENTER)
        except:
            self.browser.find_element_by_xpath('//input[@tabindex="4"]').send_keys(Keys.ENTER)


        uid = '******'   # 英文id
        

        time.sleep(1)
        # 用户主页
        # self.browser.get('网址' + uid)  # 数字id
        self.browser.get('网址' + uid)   

        print('用户最近发帖:')
        time.sleep(1)
        div1 = self.browser.find_element_by_class_name('timestampContent') # 名字是F12检查看到的值
        print('时间:' + div1.text)

        time.sleep(1)
        div2 = self.browser.find_element_by_class_name('_4vn1') # 名字是F12检查看到的值
        print('评论数:' + div2.text)

        time.sleep(1)
        div3 = self.browser.find_element_by_class_name('_6qw4') # 名字是F12检查看到的值
        div4 = self.browser.find_element_by_class_name('_3l3x') # 名字是F12检查看到的值
        print('第一条评论:' + div3.text + ':' + div4.text)

        
        time.sleep(1)
        div5 = self.browser.find_element_by_class_name('_81hb')
        print('点赞数:' + div5.text)
        #self.browser.find_element_by_class_name('_66lg').click()
        #divs1 = self.browser.find_elements_by_class_name('_6a _6b') # 名字是F12检查看到的值
        #count = 0
        #for div in divs1:
        #    print(div.text) # 输出前五个赞过的人的名字
        #    count += 1
        #    if(count == 5):
        #        break
            
        print('用户已公开的个人信息(概览):')
        # self.browser.find_element_by_link_text('简介').click()
        # time.sleep(1)
        self.browser.get('网址' + uid + '网址')
        time.sleep(1)
        divs2 = self.browser.find_elements_by_class_name('_50f8 _2iem') # 空 名字是F12检查看到的值_c24 _50f4
        for div in divs2:
            print(div.text) # 输出四个概览 工作、学校、所在地、感情状况
        divs22 = self.browser.find_elements_by_class_name('_42ef') #非空
        for div in divs22:
            print(div.text) # 输出四个概览 工作、学校、所在地、感情状况

        print('用户已公开的好友信息(好友名字):')
        # self.browser.find_element_by_link_text('好友').click()
        # time.sleep(1)
        self.browser.get('网址' + uid + '网址') 
        time.sleep(1)
        #divs3 = self.browser.find_elements_by_class_name('_6a _6b') # 名字是F12检查看到的值fsl fwb fcb
        tx = '//*[@id="pagelet_timeline_app_collection_100025583942713:2356318349:2"]/ul[1]/li[1]/div/div/div/div[2]/div'
        divs3 = self.browser.find_elements_by_xpath(tx)
        count = 0
        for div in divs3:
            print(div.text) # 输出前五个好友名字
            #count += 1
            #if(count == 5):
              #  break
        

    def main(self):
        print("==============================")


if __name__ == '__main__':
    spider = FBSpider()
    spider.main()

问题:

测试时,各个标签元素定位的问题是关键,classname定位并不是一直有效的。

 个人主页有数字id与英文 id之分。

公共主页与个人主页差异也很大。

数据过多时,比如好友列表与评论列表,需要考虑下拉刷新与AJAX异步加载的数据包。

另外,网络问题会导致页面加载问题,也会导致数据获取失败。

 

参考文章:

https://www.cnblogs.com/hanmk/p/8997786.html

https://www.cnblogs.com/LXP-Never/p/11386933.html

https://www.jianshu.com/p/5dd0208f87be

https://www.cnblogs.com/lanuage/p/9125586.html

https://blog.csdn.net/chinwuforwork/article/details/77725959

https://www.jianshu.com/p/fe7329619edd

你可能感兴趣的:(Python)