selenium的使用和scrapy的简单使用

来源:互联网 发布:jy零食淘宝店网址 编辑:程序博客网 时间:2024/05/21 13:13

selenium可以用来做自动化测试也可以拿来开发爬虫,因为selenium的网页是已经渲染过的,可以配合browsermob来嗅探视频

可以用chrome和firefox启动,我推荐firefox,因为firefox的profile好用多了。

普通的启动如下:

from selenium import webdriverdriver = webdriver.Chrome()driver.get('http://www.baidu.com')#或者driver=webdriver.Firefox()driver.get('http://www.baidu.com')

这样启动的浏览器是新的,没有任何的cookie信息,当初各种尝试导入cookie,直到我看到profile,火狐的profile目录在帮助--》故障排除信息--》配置文件--》根目录

profile=webdriver.FirefoxProfile(r'C:\Users\yearEamab\AppData\Roaming\Mozilla\Firefox\Profiles\q95dlwy9.default')driver = webdriver.Firefox(profile)

这样启动的浏览器就是你使用的浏览器,只要你的浏览器中有cookie,登录过一次,就可以跳过登录,谷歌浏览器的如下,不过不知道是不是版本问题,启动后页面没跳转

option = webdriver.ChromeOptions()option.add_argument(r'--user-data-dir=C:\Users\yearEamab\AppData\Local\Google\Chrome\User Data') #设置成用户自己的数据目录driver = webdriver.Chrome(chrome_options=option)

打开微博

driver.maximize_window()#可以调整窗口大小driver.implicitly_wait(5)driver.get("https://weibo.com")
#打开新浪科技微博将第一条转发
driver.get("https://weibo.com/sinatech?is_all=1")driver.find_element_by_xpath('//*[@id="Pl_Official_MyProfileFeed__27"]/div[1]/div[2]/div[2]/div/ul/li[2]/a').click()time.sleep(15)driver.find_element_by_xpath('//body/div[9]/div[2]/div[3]/div/div[2]/div/div[2]/div/div/div/div/textarea').clear()driver.find_element_by_xpath('//body/div[9]/div[2]/div[3]/div/div[2]/div/div[2]/div/div/div/div/textarea').send_keys('厉害啊')driver.find_element_by_xpath('//body/div[9]/div[2]/div[3]/div/div[2]/div/div[2]/div/div/div/div[2]/div/a').click()time.sleep(5)
xpath的路径可以用检查里面的copyxpath简直方便,一开始我还去数,无语

我还做了个b站的弹幕发送,但是由于b站的设置,每发一次的时间就变长,只能发个几次而已

from selenium import webdriverimport timedef send_danmu(vedio_url,num):    profile_url=r'C:\Users\yearEamab\AppData\Roaming\Mozilla\Firefox\Profiles\q95dlwy9.default'    profile=webdriver.FirefoxProfile(profile_url)    driver=webdriver.Firefox(profile)    driver.implicitly_wait(5)    time.sleep(5)    driver.get(vedio_url)    time.sleep(20)    driver.implicitly_wait(10)    frame=driver.find_element_by_xpath('//body/div[4]/div/div/div[2]/iframe')    element=driver.find_element_by_class_name('v-title')    print(element.text)    driver.switch_to.frame(frame)    # for x in range(0,num):    #     #//body/div[4]/div/div/div[2]/iframe//html/body/div/div/div/div[4]/div[3]/input    #     #//body/div[4]/div/div/div[2]/iframe//html/body/div/div/div/div[4]/div[3]/div[2]    driver.find_element_by_xpath('//html/body/div/div/div/div[4]/div[3]/input').click()    driver.find_element_by_xpath('//html/body/div/div/div/div[4]/div[3]/input').send_keys('这是弹幕')    time.sleep(5)    driver.find_element_by_xpath('//html/body/div/div/div/div[4]/div[3]/div[3]').click()    #     time.sleep(10)    driver.switch_to.default_content()if __name__=="__main__":    vedio_url=r'https://bangumi.bilibili.com/anime/6159/play#113891'    num=10    send_danmu(vedio_url,num)

做这个时遇到的问题就是b站的视频播放器放在iframe里,所以要先获取到iframe元素才行

frame=driver.find_element_by_xpath('//body/div[4]/div/div/div[2]/iframe')

driver.switch_to.frame(frame)#将工作空间转到iframe里

要记得转dirver回

driver.switch_to.default_content()

安装scrapy是出现了request visual c++ 14.0 于是我就去http://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud下了twiste的whl文件,安装成功,一开始时将获取的数据输出到外面时显示的是unicode编码,后面google了才找到答案在settings文件里加FEED_EXPORT_ENCODING='utf-8‘即可

scrapy startproject new_spider新建项目

scrapy crawl spider_name -o outputfile_name(可以是json,csv,xml)启动爬虫

scrapy runspider 也可以启动爬虫但是要到爬虫的目录下

with open('article.txt','wb') as f:     f.write(response.body)     f.close()
此时response.body返回的bytes的所以要用wb才行

with open('article_title.txt','a',encoding='utf-8') as f:     f.write(one_article.css('.title a::text').extract()[0]+'    ')     f.write(response.urljoin(one_article.css('.title a::attr(href)').extract()[0])+'\n')     f.close()
此时用选择器返回的却是str所以用w或a

可以看到response.url是str而response.body是bytes,搞不懂,下面的是返回segmentfault的第一页的所有的文章和链接,response.urljoin()则会自动补齐url

# -*- coding: utf-8 -*-import scrapyclass SegmentfaultSpiderSpider(scrapy.Spider):    name = 'segmentfault_spider'    allowed_domains = ['segmentfault.com']    start_urls = ['http://segmentfault.com/']    def parse(self, response):        # with open('article.txt','wb') as f:        #     f.write(response.body)        #     f.close()        article_list=response.css('.stream-list__item')        for one_article in article_list:            with open('article_title.txt','a',encoding='utf-8') as f:                f.write(one_article.css('.title a::text').extract()[0]+'    ')                f.write(response.urljoin(one_article.css('.title a::attr(href)').extract()[0])+'\n')                f.close()


原创粉丝点击