python爬取快代理

小白学习之路python爬虫

学爬虫也有一两周了今天首次爬取快代理记录一下所遇到的问题
来啦来啦!

直接上代码可直接套用!

  import time
    import requests
    from lxml import etree
    import re
    from selenium import webdriver
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    path = r'谷歌路径'
    client = webdriver.Chrome(executable_path=path,chrome_options=chrome_options)
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",
    }
    str_list = []
    def dispose_url(get_url):
        start_page = int(input('起始页码:'))
        end_page = int(input('结束页码:'))
        #生成url
        for page in range(start_page,end_page + 1):
            # print(page)
            url = get_url + str(page) + '/'
            request(url)
    def request(url):
        client.get(url)
        time.sleep(2)
        content_str = client.page_source
        str_list.append(content_str)
    def content_str(string):
        IP = re.findall('(\d.*?)', str(string))
        PORT = re.findall('(\d.*?)', str(string))
        # port = len(PORT)
        for x, y in zip(IP, PORT):
            IP_PORT = x + ':' + y + '\n'
            with open('ip_port.txt','a+') as fp:
                fp.write(IP_PORT)
                print('成功爬取并写入%s' %IP_PORT)
    def main():
        get_url = 'https://www.kuaidaili.com/free/inha/'
        dispose = dispose_url(get_url)
        for string in str_list:
            content_str(string)
    if __name__ == '__main__':
        main()

遇到的问题!ing 030!!

爬取思路:
1,目标url
2,发起请求获取相应
3,xpath解析相应获取需要的ip and port
4,写入文件
问题来啦!!!
在实际爬取中因为不熟练遇到的问题!!!
/**/
在我获取响应的时候发现响应内容里没有ip和port所以我用xpath的时候获取到的是一个空列表
####最后的解决方案是用无头浏览器
####模拟真实访问推荐用(phantomjs,谷歌)建议谷歌

>>>ip_list = terr.xpath('//tbody[@class]/tr[@class]/td[@data-title="IP"]')[0]
>>>port_list = terr.xpath('//tbody[@class]/tr[@class]/td[@data-title="PORT"]')[0]
>>>[ ]

于是我就怀疑是通过js动态加载于是我就去捕获他 的接口令人失望的 是我竟然没找出来哪个接口(难受ing)于是请教了同届大佬无果,最后我拿出了杀手锏(无头谷歌浏览器)经过度娘的’调教’成功用上了附上用法

>>>from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
path = '路径'
client = webdriver.Chrome(executable_path=r'path',chrome_options=chrome_options)

终于拿到了ip和port不为空的数据了(开心0^0 )可是一切并没有那么顺利解决了一个问题也出现了下一个问题 ing !!
返回的数据是一个str字符串形式那就意味着用不了xpath(可怜的我只会xpath)经过我各种收集信息各种百度最后用了
正则表达式(现学现卖)###可轻喷###
参考文章
好了一切假装很顺利的亚子(内心的苦谁懂!)
最后最后
用正则成功匹配到了相应的ip和port但是得到的是两个列表一个是全部的ip一个是全部的port那我们要的
格式是ip:port可是两个列表的合并我用了很多方法都已失败告终!!最后参考了某大佬的文章解决了感谢一下…额忘了地址了…
最后如愿以偿地拿下啦!!!

成果展现

python爬取快代理_第1张图片

欢迎评论指正***

##后期考虑加入多线程

你可能感兴趣的:(python,python,python爬虫)